鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。
鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。
每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。 相比於線性表順序結構,操作複雜。由於不必須按順序儲存,鍊錶在插入的時候可以達到o(1)的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o(n)的時間,而線性表和順序表相應的時間複雜度分別是o(logn)和o(1)。
# 定義單節點
class listnode(object):
def __init__(self, x):
self.val = x
self.next = none
在新建頭結點時:
head = listnode(0) #值為0
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
# 方法
一、把遍歷的指標都儲存起來,如果有重複就返回重複節點,沒有重複,鍊錶到底了就返回none
class solution(object):
def detectcycle(self, head):
""":type head: listnode
:rtype: listnode
"""cur = head
dict = {}
i = 0
while cur:
dict[cur] = i
cur = cur.next
if cur in dict:
return cur
i += 1
return none
# 方法
二、快慢指標,兩個不同遍歷速度的指標,如果指標重合了,說明有重複,然後再迴圈找出第乙個重複的節點(需要數學證明)
class solution(object):
def detectcycle(self, head):
""":type head: listnode
:rtype: listnode
"""slow = fast = head
while fast and fast.next and slow: # 如果不符合判斷條件,則無環,返回none
slow = slow.next
fast = fast.next.next
if slow == fast: #有環,打斷進入下乙個迴圈
break
else:
return none
temp = head
while 1: # 複製乙個頭節點,再重新走到重合
if temp == slow:
return temp
temp = temp.next
slow = slow.next
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
# 方法
一、迴圈反轉
class solution(object):
def reverselist(self, head):
""":type head: listnode
:rtype: listnode
"""if head == none:
return none
cur_0 = head
temp = cur_1 = head.next
head.next = none
while temp:
temp = cur_1.next
cur_1.next = cur_0
cur_0 = cur_1
cur_1 = temp
return cur_0
# 方法一的改進
class solution(object):
def reverselist(self, head):
""":type head: listnode
:rtype: listnode
"""cur = head
pre = none
fro = none
head_node = head
while cur: # 設定三個節點的變數,不斷變換
fro = cur.next
if fro == none:
head_node = cur
cur.next = pre
pre = cur
cur = fro
return head_node
# 方法二:遞迴
class solution(object):
def reverselist(self, head):
""":type head: listnode
:rtype: listnode
"""head_node = head
if head != none and head.next != none: #左邊條件時為了避免鍊錶為空,head=none的情況
head_node = cur = self.reverselist(head.next)
while cur.next:
cur = cur.next
cur.next = head
head.next = none
return head_node
Python之雙向鍊錶
雙向鍊錶是除頭和尾以外,頭指標指向前一節點,尾指標指向後一節點 python實現 定義雙向鍊錶 class listnode def init self,data self.head none self.data data self.next none 判斷是否為空 def isempty self...
鍊錶之雙向鍊錶
首先在說下單鏈表,才能和雙鏈表作比較 單鏈表 單向鍊錶 由兩部分組成 資料域 data 和結點域 node 單鏈表就像是一條打了很多結的繩子,每乙個繩結相當於乙個結點,每個節結點間都有繩子連線,這樣原理的實現是通過node結點區的頭指標head實現的,每個結點都有乙個指標,每個節點指標的指向都是指向...
鍊錶之環形鍊錶
leetcode 141 easy 定義兩個指標slow和fast,只要slow指標追上每次走兩步的fast指標的話就有環,否則就沒!package linkedlist public class main0141環形鍊錶 class solution141 slow slow.next fast ...