タイトル説明
逆の順番でリードシングルリンクリストのノードを、与えられました
分析
各ノードの異なるアドレスに単一のリストと単一リンクされたリストは、アレイ・ポインタ・フィールドにその前駆体ノードのみヘッドノードを横断するノードの単一のリンク・リストのいずれかへのアクセスが格納されています。操作のリストは、後続ノードを失わないように、対象のドメインを変更する時にその後継ノードのアドレスを保存するように注意を払う必要があるとき
インサイチュ逆の方法において、
メソッドの紹介
現在のノード、ノードの先行および後続ノード:ノードポインタドメインを保持する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)であります