For k = 3, you should return: 3->2->1->4->5
思路:此题是有点繁琐的,数据结构在链表的学习上本来就有些薄弱,此题调试了很久。整体思路是把所有的链表全部按照k个节点一组,反转,同时记录反转的数目num,到k之后重新计数,反转完毕之后,查看num数值,大于初始值,则将最后一组的链表再反转回来即可。代码如下:
public ListNode reverseKGroup(ListNode head, int k) {
if(k < 2 || head == null){
return head;
}
int num = 1;//计数
ListNode pre = new ListNode(0);//定义头结点
pre.next = head;
ListNode firstNode = pre;//保存头结点
ListNode next = null;//下一个节点
ListNode cur = head.next;//当前节点
ListNode curHead = head;//不随位置改变的头结点(如1,2,3),curHead =1;变为321后,curHead仍=1
while(cur != null){//当前节点不为null
next = cur.next;//保存next节点
//交换节点
pre.next = cur;
cur.next = head;
curHead.next = next;//节点交换完成
//如果next==null,num+1与k比较后返回
if(next == null){
if(++num == k){
num = 1;
}
break;
}
//为下一循环准备
head = cur;
cur = next;
//如果已交换的节点==k,则pre等节点改变位置
if(++num == k){
num = 1;
pre = curHead;
curHead = cur;
head = cur;
cur = cur.next;
}
}
//如果num>1表明最后不够k的节点也交换了,交换回来即可
if(num > 1){
curHead = head = pre.next;
cur = head.next;
while(cur != null){//与上述代码类似
next = cur.next;
//交换数据
pre.next = cur;
cur.next = head;
curHead.next = next;
//更新数据,准备下一循环
head = cur;
cur = next;
}
}
return firstNode.next;
}
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(k < 2 || head == null){
return head;
}
int num = k;
ListNode p = head;
//判断节点个数与k的大小
while(num > 1 && p != null){
p = p.next;
num--;
}
if(p == null){//说明k比节点的个数大,直接返回
return head;
}
num = k;//再次赋初始值
p = head;
ListNode q = null;//定义两个临时周转节点
ListNode r = null;
while(num > 1){
q = p.next;//保存变量
r = q.next;
//交换节点
q.next = head;
p.next = r;
//变量前进
head = q;
num--;
}
p.next = reverseKGroup(p.next,k);//递归调用
return head;
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
leetCode 25.Reverse Nodes in k-Group (以k个节点为一组反转链表) 解题思路和方法
原文地址:http://blog.csdn.net/xygy8860/article/details/46789713