给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解法1:利用栈
利用栈进行翻转,新链表是翻转后的链表,
若最后栈内节点小于K直接让新链表的尾指针指向最后一组的头节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { stack<ListNode *> s; int count; ListNode *p=head; ListNode *pre=new ListNode(0); ListNode *pr=pre; while(true) { count=0; while(count<k&&p!=NULL) { s.push(p); p=p->next; count++; } if(count<k) { pr->next=head; break; } while(!s.empty()) { ListNode *temp=new ListNode(0); temp=s.top(); s.pop(); pr->next=temp; pr=pr->next; } pr->next=p; head=p; } return pre->next; } };
|