25. K 个一组翻转链表 - 力扣(LeetCode)
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* curr = head; while (curr) { ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; }
ListNode* findth(ListNode* head,int k) { ListNode* dummy=new ListNode(0,head); ListNode* cur = dummy; while (k--) { if(cur){ cur=cur->next; }else{ return head; } } delete dummy; return cur; }
ListNode* reverseKGroup(ListNode* head, int k) { if(k==1)return head; ListNode* cur = head; ListNode* kTh=nullptr; ListNode* kThNext=nullptr; ListNode* finded=nullptr; ListNode* reversed=nullptr; ListNode* Firstreversed=nullptr; while(cur){ kTh=findth(cur,k); if(kTh == cur||kTh==nullptr){ finded->next=cur; break; }else{ kThNext=kTh->next; kTh->next=nullptr;
reversed=reverseList(cur); if(finded)finded->next=reversed; else Firstreversed=reversed;
finded=findth(reversed,k);
cur=kThNext; } } return Firstreversed; } };
|
考虑递归解法
public ListNode reverseKGroup(ListNode head, int k) { if(head == null) return null; ListNode pre = head, index = head.next; int m = 0; while (++m < k && index != null) { pre.next = index.next; index.next = head; head = index; index = pre.next; } if(m < k) { return reverseKGroup(head, m); } pre.next = reverseKGroup(index, k); return head; }
|