双向链表的一种Go语言实现
package mainimport "fmt"//定义节点信息type dNode struct { id int name string pre *dNode next *dNode}//尾部插入节点func dInsertTail(head, newNode *dNode) { //定义一个长期游走变量 temp := head for { if temp.next == nil{ break //游走到链表尾部后跳出循环进行插入数据 } temp = temp.next } //尾部增加绝对简略 temp.next = newNode newNode.pre = temp}//头部插入节点func dInsertHead(head, newNode *dNode) { temp := head //先连贯新节点的两条链到链表 newNode.next = temp.next newNode.pre = temp //再拆旧连贯到新连贯上 temp.next = newNode temp.next.pre = newNode}//程序插入节点func dInsertSort(head, newNode *dNode){ temp := head for { if temp.next == nil{ newNode.next = temp.next newNode.pre = temp temp.next = newNode //temp.next.pre = newNode break } else if temp.next.id >= newNode.id { newNode.next = temp.next newNode.pre = temp temp.next = newNode temp.next.pre = newNode break } temp = temp.next }}//头部删除节点func dDeleteHead(head *dNode){ if head.next == nil{ return }else { head.next = head.next.next }}//尾部删除节点func dDeleteTail(head *dNode){ temp := head for { if temp.next == nil { return } else if temp.next.next == nil{ //删除节点 temp.next = nil break } temp = temp.next }}//删除指定节点func dDeleteNode(head, node * dNode){ temp := head for { if temp.next == nil { return }else if temp.next.id == node.id { temp.next = temp.next.next temp.next.pre = temp break } temp = temp.next }}//显示链表元素func dList(head *dNode){ temp := head if temp.next == nil { fmt.Println("链表为空") return } for { //留神这里,我所有的思路都是在链表的以后节点操作下一个节点 fmt.Printf("%d %s --> ", temp.next.id, temp.next.name) temp = temp.next if temp.next == nil{ break } }}func main(){ head := &dNode{} node1 := &dNode{ id: 0, name: "number1", pre: nil, next: nil, } node2 := &dNode{ id: 1, name: "number2", pre: nil, next: nil, } node3 := &dNode{ id: 2, name: "number3", pre: nil, next: nil, } node4 := &dNode{ id: 3, name: "number4", pre: nil, next: nil, } dInsertHead(head, node1) dInsertTail(head, node3) dInsertSort(head, node2) dInsertSort(head, node4) dDeleteHead(head) dDeleteTail(head) dDeleteNode(head, node2) dList(head)}