博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c 语言 leetcode k个一组翻转链表
阅读量:3968 次
发布时间:2019-05-24

本文共 1609 字,大约阅读时间需要 5 分钟。

c 语言 leetcode k个一组翻转链表

题目

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

你的算法只能使用常数的额外空间。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案

/*翻转链表*/struct LinkNode* reversal(struct LinkNode* head){
if(head == NULL){
return head; } struct LinkNode* pre = (struct LinkNode* )malloc(sizeof(struct LinkNode)); pre -> next = NULL; while(head){
struct LinkNode* next = head -> next; head -> next = pre -> next; pre -> next = head; head = next; } struct LinkNode* ret = pre -> next; free(pre); return ret;}struct LinkNode* reversalKList(struct LinkNode* head,int k ){
//创建一个哑结点 ret (不存数据的头结点) struct LinkNode* ret =(struct LinkNode*)malloc(sizeof(struct LinkNode)); struct LinkNode* pre = NULL; pre = ret; pre -> next = head; struct LinkNode* tail = NULL; tail = pre; int i = 0; while(tail){
for(i = 0; i < k ; i++){
//进行分组 tail = tail->next; if(!tail){
//如果tail == NULL 直接返回不需要在翻转 return ret.next; } } //updateHead 保存 这个头结点 struct LinkNode* updateHead = NULL; updateHead = pre->next; //temp 保存 k个节点之后的那个节点 struct LinkNode* temp = NULL; temp = tail ->next; //k个节点链表的终止条件 tail -> next = NULL; //pre -> next 等于 翻转后的头结点 pre -> next = reversal(updateHead); //翻转后updateHead 就是k个节点的尾节点 //链接下一个的k个节点的头结点 updateHead -> next = temp; //计算下一组 pre = updateHead ; tail = pre; } return ret.next;}
你可能感兴趣的文章
循环语句
查看>>
DB2 临时表
查看>>
ITERATE、LEAVE、GOTO和RETURN
查看>>
异常处理
查看>>
存储过程
查看>>
动态SQL(Dynamic SQL)
查看>>
在存储过程之间传递数据
查看>>
迁移存储过程
查看>>
GET DIAGNOSTIC 语句
查看>>
Python 简介
查看>>
Python 注释
查看>>
Python 变量
查看>>
Python 数据类型 -- 数字
查看>>
Spring 管理对象
查看>>
Spring 自定义对象初始化及销毁
查看>>
Spring Batch 环境设置
查看>>
字符组转译序列
查看>>
字符转译序列
查看>>
Java 数据类型
查看>>
UTF-16 编码简介
查看>>