双向链表
循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指向其前驱的指针域prior。这样形成的链表中就有两条方向不同的链,我们可称之为双(向)链表(Double Linked List)
双向链表示意图:
golang双链表案例代码(增删改查):
package main
import (
"fmt"
)
type studentNode struct {
no int
name string
age int
pre *studentNode
next *studentNode
}
//给双向链表插入一个结点
//编写第一种插入方法,在双向链表的最后加入
func insertStudentNode(head *studentNode, newStudentNode *studentNode) {
//思路:
//1.先找到该链表的最后这个结点
//2.创建一个辅助结点
temp := head
for {
if temp.next == nil {
//表示找到最后
break
}
temp = temp.next //让temp不断的指向下一个结点
}
//3.将newStudentNode加入到链表的最后
temp.next = newStudentNode
newStudentNode.pre = temp
}
//第二种插入方法,根据no的编号从大到小插入
func sortInsertStudentNode(head *studentNode, newStudentNode *studentNode) {
//思路
//1.找到适当的位置
//2.创建一个辅助结点
temp := head
flag := true
//把newStudentNode.no和temp.next.no作比较
for {
if temp.next == nil {
//说明已经到链表的最后啦
break
}