単一リンクリストデータ構造は、Pythonを逆転します

タイトル説明

逆の順番でリードシングルリンクリストのノードを、与えられました

分析

各ノードの異なるアドレスに単一のリストと単一リンクされたリストは、アレイ・ポインタ・フィールドにその前駆体ノードのみヘッドノードを横断するノードの単一のリンク・リストのいずれかへのアクセスが格納されています。操作のリストは、後続ノードを失わないように、対象のドメインを変更する時にその後継ノードのアドレスを保存するように注意を払う必要があるとき

インサイチュ逆の方法において、

メソッドの紹介

現在のノード、ノードの先行および後続ノード:ノードポインタドメインを保持する3つのポインタ変数を必要とする彼の先行ノードを指すように現在のドメインを指す修飾ノードポインタのリストを横断するとき

ソース


class Node(object):
    """结点"""
    def __init__(self,data=None):
        self.data = data
        self.next = None

def reverse(head):
    """链表逆序"""
    if head == None or head.next == None:
        return
    cur = head.next      #当前节点
    next = cur.next #后继节点
    #将原来的头结点变为为节点
    pre = cur       #前驱节点
    cur.next = None
    cur = next
    while cur.next != None:
        next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    #最后一个进不了循环,在外面整
    cur.next = pre
    head.next = cur

def main():
    #创建单链表
    print("逆序前的链表为:", end=" ")
    head = Node()
    for i in range(10):
        """创建单链表"""
        node = Node(i)
        cur = head
        if head.next == None or head == None:
            head.next = node
        else:
            while cur.next != None:
                cur = cur.next
            cur.next = node
    cur = head
    while cur.next != None:
        cur = cur.next
        print(cur.data, end=" ")
    print("\n逆序后的链表为:", end=" ")
    reverse(head)
    cur = head
    while cur.next != None:
        cur = cur.next
        print(cur.data, end=" ")

if __name__ == '__main__':
    main()

性能解析

上記方法は、リンクされたリストの一方のみトラバーサルを必要とし、時間計算量はO(N)であり、Nはリストの長さです。その空間的複雑度はO(1)であるので、この方法は、二つの追加の変数のストレージノードと先行後続ノードを必要とします。

方法2つの逆挿入方法

メソッドの紹介

ノードの第2のリストから、ノードは、トラバースの端部までの後頭部へのノードをトラバース。

ソース


class Node(object):
    """结点"""
    def __init__(self,data=None):
        self.data = data
        self.next = None

def reverse(head):
    """链表逆序"""
    if head == None or head.next == None:
        return

    cur = head.next.next
    head.next.next = None
    while cur != None:
        next = cur.next
        cur.next = head.next
        head.next = cur
        cur = next

def main():
    #创建单链表
    print("逆序前的链表为:", end=" ")
    head = Node()
    for i in range(10):
        """创建单链表"""
        node = Node(i)
        cur = head
        if head.next == None or head == None:
            head.next = node
        else:
            while cur.next != None:
                cur = cur.next
            cur.next = node
    cur = head
    while cur.next != None:
        cur = cur.next
        print(cur.data, end=" ")
    print("\n逆序后的链表为:", end=" ")
    reverse(head)
    cur = head
    while cur.next != None:
        cur = cur.next
        print(cur.data, end=" ")

if __name__ == '__main__':
    main()

性能解析

この方法はまた、リンクされたリストの一方のみトラバーサルを必要とし、同じ時間計算は先行ノードのアドレスを格納するために追加の変数を必要としない方法で、従ってより少ないスペースの複雑さに比べて、O(N)であります

おすすめ

転載: www.cnblogs.com/tianyb/p/10984820.html