标签:
题目:按k个结点一组来反转链表
思路:
运用反转链表的通法reverse,对链表进行循环,当计数长度k不时,指针继续前进;当计数长度到达k时,将该组首尾节点first和node作为参数传入翻转函数reverse进行翻转,然后重新拼接到原链表中。直至到达链表末尾。
代码如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode reverseKGroup(ListNode head, int k) { if(head == null||head.next == null||k<=1) return head; ListNode node=head; ListNode helper=new ListNode(0);//创建一个辅助的头结点; helper.next=head;//当k> length of list时,返回原链表; ListNode lastgroup=helper;//记录上一组结点的尾结点; ListNode nextgroup=head;//辅助记录下一组结点的首结点; ListNode first=nextgroup;//记录下一组结点的首结点; int count=1; while(node!=null) { if(count<k) { count++; node=node.next; }else//count == k; { nextgroup=node.next; lastgroup.next=reverse(first,node); lastgroup=first; first.next=nextgroup; first=nextgroup; node=first; count=1; } } return helper.next; } //字符串反转通用方法; public ListNode reverse(ListNode head,ListNode tail) { ListNode pre=head; ListNode cur=head.next; ListNode ne=null; while(pre!=tail) { ne=cur.next; cur.next=pre; pre=cur; cur=ne; } head.next=null; head=pre; return head; } }
标签:
原文地址:http://blog.csdn.net/jingsuwen1/article/details/51361308