双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

代码实现

ackage main

import (
	"fmt"
)

type LinkNode struct {
	no int
	name string
	prev *LinkNode
	next *LinkNode
}

//显示节点
func ShowNode(head *LinkNode) {
	//创建辅助节点
	temp := head
	if temp.next == nil {
		fmt.Println("空空如也")
		return
	}
	for{
		fmt.Printf("[%d,%s,%s] ==>",temp.next.no,temp.next.name)
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
	fmt.Println()

}

//给双向链表插入一个节点
func InsertNode(head *LinkNode,newNode *LinkNode) {
	temp := head
	for{
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	temp.next = newNode
	newNode.prev = temp
}
//双向链表有序添加
func InsertOrderNode(head *LinkNode,newNode *LinkNode) {
	//创建辅助节点
	temp := head
	flag := true
	for {
		if temp.next == nil {
			//说 明到链表的最后
			break
		} else if temp.next.no > newNode.no {
			//插入到temp后面
			break
		} else if temp.next.no == newNode.no {
			flag = false //说明链表中以存在该节点
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("当前节点以存在",newNode.no)
		return
	} else {
		newNode.next = temp.next
		newNode.prev = temp
		if temp.next != nil {
			temp.next.prev = newNode
		}
		temp.next = newNode
		
	}
}
//双向链表的删除
func DeleteNode(head *LinkNode,no int) {
	temp := head
	flag := false
	for{
		if temp.next == nil { //到达链表的最后
			break
		} else if temp.next.no == no {
			flag = true
			break
		}
		temp = temp.next
	}
	if flag { //说明找到
		temp.next = temp.next.next
		if temp.next != nil {
			temp.next.prev = temp
		}
	} else {
		fmt.Println("没有要删除的节点")
	}
}



func main() {
	head := &LinkNode{}
	person1 := &LinkNode{
		no:1,
		name:"张三",
	}
	person2 := &LinkNode{
		no:2,
		name:"李四",
	}
	person3 := &LinkNode{
		no:3,
		name:"王五",
	}
	InsertOrderNode(head,person3)
	InsertOrderNode(head,person2)
	InsertOrderNode(head,person1)
	DeleteNode(head,2)
	ShowNode(head)

	// InsertNode(head,person1)
	// InsertNode(head,person2)
	// ShowNode(head)


}

结果

[1,张三,%!s(MISSING)] ==>[2,李四,%!s(MISSING)] ==>[3,王五,%!s(MISSING)] ==>

参与文档