Reverse Nodes in k-Group
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->5Given 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->5class Solution:
"""
@param: head: a ListNode
@param: k: An integer
@return: a ListNode
"""
def reverseKGroup(self, head, k):
def getKth(head):
for i in range(k - 1):
if not head:
return None
head = head.next
return head
def reverse(preHead, tail):
if preHead.next == tail:
return
head = preHead.next
tailNext = tail.next # 这里很重要,要提前保存好 tail.next, 否则的话tail会丢失next
# reverse head 和 tail 之间的部分
prev = head
curr = head.next
next = None
while curr != tailNext:
next = curr.next
curr.next = prev
prev = curr
curr = next
# 重新连接左右部分和中间部分
head.next = tailNext
preHead.next = tail
# main part
dummy = ListNode(0)
dummy.next = head
preHead = dummy
while True:
kth = getKth(preHead.next)
nextPreHead = preHead.next
if not kth:
break
reverse(preHead, kth)
preHead = nextPreHead
return dummy.nextclass Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode start = head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prevStart = dummy;
while (true) {
ListNode kth = getKth(start, k);
if (kth == null) break;
// 记录下一段的head,断开kth.next
ListNode nextStart = kth.next;
kth.next = null;
// 链接上一段和这一段reverse之后的新head,新head是kth
prevStart.next = kth;
reverse(start);
// reverse 之后,kth为新head,之前的start为tail
prevStart = start;
start.next = nextStart;
start = nextStart;
}
return dummy.next;
}
// get the k-th node, include head
private ListNode getKth(ListNode head, int k) {
int count = 1;
ListNode curr = head;
while (count < k && curr != null) {
curr = curr.next;
count++;
}
return curr;
}
private ListNode reverse(ListNode head) {
ListNode prev = null;
ListNode curr = head;
ListNode next = null;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode kth = getKth(head, k);
if (kth == null) return head;
ListNode nextHead = kth.next;
kth.next = null;
reverse(head);
// kth is the new head, head is now the tail
head.next = reverseKGroup(nextHead, k);
return kth;
}
// get the k-th node, include head
private ListNode getKth(ListNode head, int k) {
int count = 1;
ListNode curr = head;
while (count < k && curr != null) {
curr = curr.next;
count++;
}
return curr;
}
private ListNode reverse(ListNode head) {
ListNode prev = null;
ListNode curr = head;
ListNode next = null;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || head.next == null) return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while (true) {
ListNode currHead = prev.next;
ListNode kth = getKth(currHead, k);
if (kth == null) break;
ListNode nextHead = kth.next;
kth.next = null;
reverse(currHead);
prev.next = kth;
currHead.next = nextHead;
prev = currHead;
}
return dummy.next;
}
private void reverse(ListNode head) {
ListNode prev = null, curr = head, next = head.next;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
}
private ListNode getKth(ListNode head, int k) {
for (int i = 1; i < k; ++i) {
if (head == null) return head;
head = head.next;
}
return head;
}
}