链表问题---将单链表的每K个节点之间逆序

来源:互联网 发布:淘宝网找回密码 编辑:程序博客网 时间:2024/05/29 18:02

【题目】

  给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点,则不调整最后的节点。

【基本思路】

  方法一。时间复杂度O(N),空间复杂度O(K)。
  
  利用栈结构,依次遍历链表,将节点压入栈中,栈中节点每凑到k个就将这k个节点进行逆序,然后再连接入链表中。需要注意头节点的更新以及每组节点两头的连接。代码实现如下:

#python3.5def 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
原创粉丝点击