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