【题目】
给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点,则不调整最后的节点。
【基本思路】
方法一。时间复杂度O(N),空间复杂度O(K)。
利用栈结构,依次遍历链表,将节点压入栈中,栈中节点每凑到k个就将这k个节点进行逆序,然后再连接入链表中。需要注意头节点的更新以及每组节点两头的连接。代码实现如下:
#python3.5
def reverseKNode(head, k):
def reverse(stack, pre, next):
while stack:
cur = stack.pop()
if pre != None:
pre.next = cur
pre = cur
pre.next = next
return pre
if head == None or head.next == None or k < 2:
return head
stack = []
cur = head
newHead = head
pre = None
while cur != None:
next = cur.next
stack.append(cur)
if len(stack) == k:
pre = reverse(stack, pre, next)
newHead = cur if newHead == head else newHead
cur = next
return newHead
方法二。时间复杂度O(N),空间复杂度O(1)。
不需要利用栈,用变量记录每一组开始的第一个节点和最后一个节点,然后直接逆序调整,把这一组的节点都逆序。需要注意头节点的更新以及每组节点两头的连接。代码实现如下:
def reverseKNode2(head, k):
def reverse2(head, left, right):
pre = None
start = head
while head != right:
next = head.next
head.next = pre
pre = head
head = next
if left != None:
left.next = pre
start.next = right
if head == None or head.next == None or k < 2:
return head
pre = None
cur = head
count = 0
while cur != None:
count += 1
next = cur.next
if count == k:
start = head if pre == None else pre.next
head = cur if pre == None else head
reverse2(start, pre, next)
pre = start
count = 0
cur = next
return head