【LeetCode】25. k个一组翻转链表

xiaoxiao2025-09-04  230

题目描述

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

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

示例 :

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

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

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

说明 :

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

 

思路及代码

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode* p = head; ListNode* q = head; ListNode* r; //若链表为空或k=1直接返回head if(!p || k == 1) return p; for(int i = 1; i < k; i ++){ //若剩余结点不够k个则直接返回head if(!p->next) return head; p = p->next; } //p,r为分界线,p为前面需要倒置的链表的最后一个结点,r为进入递归的第一个节点(head) r = p->next; //截取链表 p->next = NULL; //temp为倒置后的链表 ListNode* temp = reverse(head); ListNode* res = temp; //找到链表最后 while(temp->next){ temp= temp->next; } //在链表最后递归拼接需要倒置的其他链表 temp->next = reverseKGroup(r,k); return res; } //反转链表方法 ListNode* reverse(ListNode* head) { if(head == NULL) return head; ListNode* p,*q,*r; p = head; q = p->next; p->next = NULL; while(q){ r = q->next; q->next = p; p = q; q = r; } return p; } };

 

转载请注明原文地址: https://www.6miu.com/read-5035715.html

最新回复(0)