天天看點

go語言實作雙向連結清單

```

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