Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For example,
Given this linked list:1->2->3->4->5
For k = 2, you should return:2->1->4->3->5
For k = 3, you should return:3->2->1->4->5
https://oj.leetcode.com/problems/reverse-nodes-in-k-group/
思路1:模拟题,仔细处理即可。
注意reverse函数的实现,实现pre和next之间的翻转(exclusive),返回的是原来第一个元素,现在在最后位置上(不包括pre和next)。
注意cur迭代,如果reverse之后 cur=pre.next;而不是cur=cur.next,因为此时cur已经换到前面去了。
public class Solution { public ListNode reverseKGroup(ListNode head, int k) { if(head==null||k==1) return head; ListNode dummyHead = new ListNode(-1); dummyHead.next=head; ListNode pre = dummyHead; ListNode cur = head; int count=0; while(cur!=null){ count++; if(count==k){ pre=reverse(pre,cur.next); cur=pre.next; count=0; } else{ cur=cur.next; } } return dummyHead.next; } private static ListNode reverse(ListNode pre, ListNode next){ ListNode last = pre.next; ListNode cur = last.next; while(cur != next){ last.next = cur.next; cur.next = pre.next; pre.next = cur; cur = last.next; } return last; } }
参考:
http://rleetcode.blogspot.com/2014/01/reverse-nodes-in-k-group-java.html
http://blog.csdn.net/linhuanmars/article/details/19957455
http://www.cnblogs.com/lichen782/p/leetcode_Reverse_Nodes_in_kGroup.html