package main
import
"fmt"
type node struct
// 末尾插入
func
insert
(head *node, newnode *node)
tmp = tmp.next }}
// 正向遍歷
func
list
(head *node)
forelse
tmp = tmp.next }}
// 反向遍歷
func
reverselist
(head *node)
// 先將tmp指向鍊錶末尾
for tmp = tmp.next
}for
else
tmp = tmp.pre }}
func
main()
node :=
&node
node2 :=
&node
node3 :=
&node
node4 :=
&node
insert
(head, node)
insert
(head, node2)
insert
(head, node3)
insert
(head, node4)
list
(head)
fmt.
println()
reverselist
(head)
}
輸出結果:
// 放在第二順位,當未找到插入最後
if tmp.next ==
nil// 遍歷是從前往後,判斷條件tmp.next是保證在tmp後面插入前插入
if newnode.num < tmp.next.num
tmp = tmp.next }}
func
list
(head *node)
forelse
tmp = tmp.next }}
func
delete
(head *node, num int
)// 注意這裡要找到tmp.next,因為找到tmp是要刪除節點無法刪除
if tmp.num == num
else
} tmp = tmp.next }}
func
main()
node :=
&node
node2 :=
&node
node3 :=
&node
node4 :=
&node
orderinsert
(head, node4)
orderinsert
(head, node2)
orderinsert
(head, node)
orderinsert
(head, node3)
list
(head)
fmt.
printf
("****************\n"
)delete
(head,2)
list
(head)
}輸出結果:
ps:這裡演示的是重複插入在最後的情況,所以要將重複判斷放在末尾插入之前
總結:1、無論單鏈表還是雙鏈表插入一定定位在tmp和tmp.next之間
2、頭節點資料是空的,但不代表頭節點=nil
3、刪除和插入是一定要考慮刪除的恰好是最後的節點或者插入到最後的情況
演算法(雙鏈表)
實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k個插入的數右側插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊...
迴圈雙鏈表演算法
設乙個帶頭結點的迴圈雙鏈表 dl,結點的值可能重複。設 計乙個演算法輸出 dl 所有元素的值,引數 d 0 時按照前驅方向輸出,d 1 時按照 後繼方向輸出。記得那次作業裡有乙個寫的很麻煩沒啥意思好像就是這個 建立乙個迴圈單鏈表,然後設乙個輸出函式 include include include d...
雙鏈表的演算法操作
1 雙鏈表 雙鏈表就是在單鏈表結點上增添了乙個指標域,指向當前結點的前驅。2 雙鏈表結點定義 typedef struct doublelinkedlists doublelinkedlists 3 插入結點的演算法 假設在雙鏈表中p所指的結點之後插入乙個結點s,操作如下 1 s next p ne...