1.8單鏈表以k個節點爲一組翻轉

單鏈表以k個節點爲一組進行翻轉

解題思路:

首先把前K個結點當作一個子鏈表,採用前面介紹的方法進行翻轉,把翻轉後的子鏈表連接到頭結點後面,而後把接下來的K個結點當作另一個單獨的鏈表進行翻轉,把翻轉後的子鏈表連接到上一個已經完成翻轉子鏈表的後面node

圖示:

代碼實現

# -*-coding:utf-8-*- 
"""
@Author  : 圖南
@Software: PyCharm
@Time    : 2019/9/7 11:37
"""


class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next


def con_link(n):
    head = Node()
    cur = head
    for i in range(1, n + 1):
        node = Node(i)
        cur.next = node
        cur = node
    return head


def print_link(head):
    if head is None or head.next is None:
        return
    cur = head.next
    while cur:
        print(cur.data, end=" ")
        cur = cur.next
    print()


def reverseKNode(head, k):
    if head is None or head.next is None:
        return
    if k == 0 or k == 1:
        return head
    pre = head
    begin = head.next
    while begin:
        end = begin
        for i in range(k-1):
            if end.next:
                end = end.next
            else:
                return head
        next= end.next
        end.next = None
        r_head, r_end = reverseLink(begin)
        r_end.next = next
        pre.next = r_head
        pre = r_end
        begin = next
    return head




def reverseLink(head):
    if head is None or head.next is None:
        return
    r_end = head
    pre = head
    r_head = pre.next
    pre.next = None
    while r_head.next:
        next = r_head.next
        r_head.next = pre
        pre = r_head
        r_head = next
    r_head.next = pre
    return r_head, r_end


if __name__ == '__main__':
    n = int(input("請輸入n:"))
    k = int(input("請輸入k:"))
    head = con_link(n)
    print_link(head)
    head = reverseKNode(head, k)
    print_link(head)

運行結果:



相關文章
相關標籤/搜索