Python之鍊錶

2021-09-04 04:18:05 字數 3132 閱讀 8889

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。

鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。

每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。 相比於線性表順序結構,操作複雜。由於不必須按順序儲存,鍊錶在插入的時候可以達到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 ...