数据结构--双向链表
Posted Yuan_sr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--双向链表相关的知识,希望对你有一定的参考价值。
双向链表的一种Go语言实现
package main
import "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)
}
以上是关于数据结构--双向链表的主要内容,如果未能解决你的问题,请参考以下文章