2. Reverse Nodes in k-Group

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

注意:
1.空指针和只有一个节点之类的边界情况。

  1. 更新链表之后,没有将链表尾部置空,造成它指向其他的节点,构成环,或者想拆下链表的一部分时没有把那部分的尾部置空,构成环。
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
```
class Solution(object):
    """
    :type head: ListNode
    :type k: int
    :rtype: ListNode
    """
    def reverse(self,head):
        newHead = head
        head = head.next
        while head != None:
            t = head
            head = head.next
            t.next = newHead
            newHead = t
        return newHead
    def reverseKGroup(self, head, k):
        if head == None or head.next == None:
            return head
        indexNode = head.next
        newHead = head
        newTailer = head
        newTailer.next = None
        for i in range(k-1):
            if indexNode == None:
                self.reverse(newHead)
                t = newHead
                newHead = newTailer
                newTailer = t
                break
            t = indexNode
            indexNode = indexNode.next
            t.next = newHead
            newHead = t
        head = newHead
        listEndNode = newTailer
        while indexNode != None:
            # get the first one
            newHead = indexNode
            newTailer = indexNode
            indexNode = indexNode.next
            newTailer.next = None

            # get the k-1 node
            for i in range(k-1):
                if indexNode == None:
                    self.reverse(newHead)
                    t = newHead
                    newHead = newTailer
                    newTailer = t
                    break
                t = indexNode
                indexNode = indexNode.next
                t.next = newHead
                newHead = t
            listEndNode.next = newHead
            #reset the end value
            listEndNode = newTailer
         # important next must set null , or the next may pointor othor palce
        listEndNode.next = None
        return head

看我改进版,减少初始判断。。。

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    """
    :type head: ListNode
    :type k: int
    :rtype: ListNode
    """
    def reverse(self,head):
        newHead = head
        head = head.next
        while head != None:
            t = head
            head = head.next
            t.next = newHead
            newHead = t
        return newHead

    def reverseKGroup(self, head, k):
        if head == None or head.next == None:
            return head
        indexNode = head
        head = ListNode(0)
        listEndNode = head
        while indexNode != None:
            # get the first one
            newHead = indexNode
            newTailer = indexNode
            indexNode = indexNode.next
            newTailer.next = None

            # get the k-1 node
            for i in range(k-1):
                if indexNode == None:
                    self.reverse(newHead)
                    t = newHead
                    newHead = newTailer
                    newTailer = t
                    break
                t = indexNode
                indexNode = indexNode.next
                t.next = newHead
                newHead = t
            listEndNode.next = newHead
            #reset the end value
            listEndNode = newTailer
         # important next must set null , or the next may pointor othor palce
        listEndNode.next = None
        return head.next

你可能感兴趣的:(2. Reverse Nodes in k-Group)