雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。
**如下:
package doublelinkedlist
import (
"errors"
"fmt"
)type elemtype inte***ce{}
//結點
type node struct
//鍊錶
type
list struct
//工廠函式
func createlist() *
list
}//尾插法
func (list
*list) pushback(x elemtype)
//頭插法
func (list
*list) pushfront(x elemtype)
list
.size++
}//尾刪法
func (list
*list) popback() bool
s :=
list
.last.pre //找到最後乙個節點的前驅
s.next =
list
.first
list
.last = s
list
.size--
return
true
}//頭刪法
func (list
*list) popfront() bool
s :=
list
.first.next //找到第乙個節點
list
.first.next = s.next
s.next.pre =
list
.first
iflist
.size ==
1 list
.size--
return
true
}//查詢指定元素
func (list
*list) find(x elemtype) *node else
}return nil
}//按值刪除結點
func (list
*list) deleteval(x elemtype) bool
return
true
}return
false
}//把值為x的元素的值修改為y
func (list
*list) modify(x, y elemtype) bool
return
false
}//判斷鍊錶是否為空
func (list
*list) isempty() bool
//反轉鍊錶
//保留第乙個結點,將剩餘的結點游離出來,然後依次頭插到保留的結點中
func (list
*list) reverse()
}}//列印鍊錶
func (list
*list) print() error
s :=
list
.first.next
for s !=
list
.first
fmt.println()
return nil
}
簡單使用了一下:
package main
import (
"learngo/lang/datastruct/doublelinkedlist"
)func main()
for _, v := range s
list.modify(5, 55)
list.print()
list.deleteval(7)
list.print()
list.popback()
list.print()
list.popfront()
list.print()
list.reverse()
list.print()
}
輸出結果:
1 2 3 4 55 6 7
1 2 3 4 55 6
1 2 3 4 55
2 3 4 55
55 4 3 2
參考文章:
雙向鍊錶的GO語言實現
一 什麼是雙向鍊錶 和單鏈表比較,雙向鍊錶的元素不但知道自己的下線,還知道自己的上線 越來越像傳銷組織了 小煤車開起來,圖裡面可以看出,每個車廂除了乙個指向後面車廂的箭頭外,還有乙個指向前面車廂的箭頭 車頭 車尾除外 車頭只有指向後面車廂的箭頭,車尾只有指向前面車廂的箭頭。二 雙向鍊錶與go的對應結...
C語言實現雙向迴圈鍊錶
list 雙向迴圈鍊錶,帶頭指標 struct list node 初始化頭指標 void list init head struct list node head 量表是否為空 是返回1,否返回0 int list is empty const struct list node head 鍊錶遍歷...
C語言實現雙向迴圈鍊錶
list 雙向迴圈鍊錶,帶頭指標 struct list node 初始化頭指標 void list init head struct list node head 量表是否為空 是返回1,否返回0 int list is empty const struct list node head 鍊錶遍歷...