博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#leetcode刷题之路25- k个一组翻转链表
阅读量:4976 次
发布时间:2019-06-12

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

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

思路:先把是不是从头开始区分一下,然后每一次翻转之前,都要判断数量够不够k

#include 
using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};ListNode* createlist(int n)//生成链表{ if (n == 0) return nullptr; ListNode* head = (ListNode*)malloc(sizeof(ListNode)); cin >> head->val; ListNode* pre = head; for (int i = 0; i < n - 1; i++) { ListNode* p = (ListNode*)malloc(sizeof(ListNode)); cin >> p->val; pre->next = p; pre = pre->next; } pre->next = nullptr; return head;}ListNode* reverselist(ListNode* head, ListNode *p, int k){ int tk = k;//暂时保存k的值 if (head == p)//是头 { ListNode* temp = head;// ListNode* endd = head;// ListNode* ttemp=nullptr; ListNode* pre = nullptr;//保存已反转的下一个 ListNode* end = nullptr;// ListNode* t = head;//保存反转过的最后一个 while (tk > 0)//说明从头节点开始有K个节点可供反转 { if (temp != nullptr) { temp = temp->next; tk--; } else return head; }//while循环后temp指针指向链表的第K+1个节点 //cout<
val<
next; head->next = nullptr; //cout<
val<
next; pre->next = head; head = pre; pre = end; } //cout << t->val << endl; endd->next = temp;//连接后面剩下的 //带头的前k个处理完了,判断接下来的够不够k个 tk = k; //temp = t; while (tk != 0)//是否可继续处理 { if (temp != nullptr) { temp = temp->next; tk--; } else return head; } //cout << t->val <
next->val<< endl; //cout << head->val << head->next->val << endl; reverselist(head, t, k);//够的话就递归反转 } else { ListNode* pre = p;//保存已经反转过的最后一个-------------------- ListNode*cur = pre->next;//保存待反转的第一个 ListNode* cur_next=cur->next ;//保存待反转的下一个 ListNode* end = nullptr;//存放待反转的最后一个节点的下一个节点---------------------- ListNode* thead=nullptr;//存放转后的头节点--------------- ListNode* tcur = cur_next->next;//存放当前的cur_next的下一个节点,即下次要反转的那个------------------ ListNode* temp = nullptr;//记录反转的链表尾 ListNode* t = nullptr;// //-----------------------------先反转第一次 cur_next->next = cur; cur->next = nullptr; temp = cur; thead = cur_next; tk = k-2; while (tk > 0) { cur = tcur; tcur = tcur->next; cur->next = thead; thead = cur; tk--; } pre->next = thead; temp->next = tcur; t = temp->next; //带头的前k个处理完了,判断接下来的够不够k个 tk = k; //temp = t; while (tk != 0)//是否可继续处理 { if (t != nullptr) { t = t->next; tk--; } else return head; } reverselist(head, temp, k);//够的话就递归反转 } return head;}ListNode* reverseKGroup(ListNode* head, int k) { if (head == nullptr || k == 0 || k == 1) return head; ListNode *temp = head; head = reverselist(head, head, k); return head;}int main() { ListNode* head = createlist(4); ListNode*ans = reverseKGroup(head, 2); while (ans != nullptr) { cout << ans->val << endl; ans = ans->next; } return 0;}

 

转载于:https://www.cnblogs.com/biat/p/10560833.html

你可能感兴趣的文章
mysql sin() 函数
查看>>
单片机复位电路
查看>>
php json_decode失败,返回null
查看>>
3-day3-list-truple-map.py
查看>>
Edit控件显示多行文字
查看>>
JS第二周
查看>>
dataTable.NET的search box每輸入一個字母進行一次檢索的問題
查看>>
Python 文件处理
查看>>
邻接表详解
查看>>
迭代dict的value
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>
Py 可能是最全面的 python 字符串拼接总结(带注释版)
查看>>
《Java程序设计实验》 软件工程18-1,3 OO实验2
查看>>
【Herding HDU - 4709 】【数学(利用叉乘计算三角形面积)】
查看>>
OPENSSL使用方法
查看>>
开发WINDOWS服务程序
查看>>
cross socket和msgpack的数据序列和还原
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
更新.net core 3.0,dotnet ef命令无法使用的解决办法
查看>>
前端利器躬行记(1)——npm
查看>>