```
package main
/* 雙向連結清單結構體*/
type DuLNodestruct{
valinterface{}
prefix *DuLNode// 前一個節點
rear *DuLNode// 後一個節點
}
/* 初始化雙向連結清單*/
func (L *DuLNode) IninDul() {
L.val = nil
L.prefix = nil
L.rear = nil
/* 清空雙向連結清單*/
func (L *DuLNode) ClearDul() {
L.IninDul()
/* 删除雙向連結清單*/
func (L *DuLNode) DeleteDul() {
/* 擷取第i個結點的值*/
func (L *DuLNode) GetVal(i uint32)interface{} {
return L.val
/* 擷取雙向連結清單的長度*/
func (L *DuLNode) Length() uint32 {
// 雙向連結清單為空
if L.prefix == nil {
return 0
}
p := L
length := uint32(1)
for p.rear != L {
length +=1
p = p.rear
return length
/* 在第i個節點插入資料*/
func (L *DuLNode) Insert(i uint32, einterface{}) {
length := L.Length()
if length ==0 {
L.val, L.rear, L.prefix = e, L, L
return
p := DuLNode{e, nil, nil}
// 末尾插入一個資料
if i > length +1 {
p.rear = L.rear
L.rear.prefix = &p
p.prefix = L
// 頭部插入一個資料
if i <=1 {
L = &p
// 其他位置插入資料,n的位置為要插入的位置前一個位置節點
n := L
for j := uint32(2);j < i;j +=1 {
n = n.rear
p.rear = n
n.prefix = &p
p.prefix = n
/* 在第i個節點删除資料,傳回删除所在位置的值*/
func (L *DuLNode) Delete(i uint32)interface{} {
// 雙向連結清單的長度等于0
return nil
if i <1 {
// 删除頭部節點
L.rear.prefix = L.prefix
L.prefix.rear = L.rear
res := L.val
L = L.prefix
return res
}else if i > length {
// 删除末尾元素
i = length
res := L.rear.val
L.rear.rear.prefix = L
L.rear = L.rear.rear
n := L
p := n.prefix
n.prefix = p.prefix
p.prefix.rear = n
return p.val
/* 依次對雙向連結清單的每個元素調用visit().一旦visit()失敗,則棧操作失敗*/
func (L *DuLNode) StackTraverse(visitfunc(a ...interface{})) {
if L.prefix == nil {
for n != L {
visit(n)
n = n.prefix