线性表的链式存储
单向链表
链表的操作方法
创建链表 Create(数据集) 打印链表 Print() 获取链表长度 (数据结点的个数,不包含头结点)Length() int 插入结点:头插法 InsertByHead(数据) 插入结点:尾插法 InsertByTail(数据) 按位置插入:InsertByIndex(数据,index) 按位置删除:DeleteByIndex(index) 按数据删除:DeleteByData(数据) 按数据查找:SearchByData(数据) index 销毁链表:Destroy()
创建链表
type LinkNode struct {
Data interface { }
Next * LinkNode
}
func ( node * LinkNode) Create ( Data ... interface { } ) {
if node == nil || Data == nil {
return
}
if len ( Data) == 0 {
return
}
head := node
for _ , v := range Data {
newNode := new ( LinkNode)
newNode. Data = v
newNode. Next = nil
node. Next = newNode
node = node. Next
}
node = head
}
打印链表
func ( node * LinkNode) Print1 ( ) {
if node == nil {
return
}
if node. Data != nil {
fmt. Print ( node. Data, " " )
}
node. Next. Print1 ( )
}
func ( node * LinkNode) Print2 ( ) {
if node == nil {
return
}
for node. Next != nil {
node = node. Next
if node. Data != nil {
fmt. Println ( node. Data)
}
}
}
获取链表长度
func ( node * LinkNode) Length ( ) int {
if node == nil {
return - 1
}
i := 0
for node. Next != nil {
node = node. Next
i++
}
return i
}
头插法
func ( node * LinkNode) InsertByHead ( Data interface { } ) {
if node == nil || Data == nil {
return
}
newNode := new ( LinkNode)
newNode. Data = Data
newNode. Next = nil
newNode. Next = node. Next
node. Next = newNode
}
尾插法
func ( node * LinkNode) InsertByTail ( Data interface { } ) {
if node == nil || Data == nil {
return
}
newNode := new ( LinkNode)
newNode. Data = Data
newNode. Next = nil
for node. Next != nil {
node = node. Next
}
node. Next = newNode
}
按位置插入
func ( node * LinkNode) InsertByIndex ( Data interface { } , index int ) {
if node == nil || Data == nil {
return
}
if index < 0 || index > node. Length ( ) {
return
}
newNode := new ( LinkNode)
newNode. Data = Data
newNode. Next = nil
preNode := node
for i := 0 ; i < index; i++ {
preNode = node
node = node. Next
}
newNode. Next = node
preNode. Next = newNode
}
func ( node * LinkNode) InsertByIndex2 ( Data interface { } , index int ) {
if node == nil || Data == nil {
return
}
if index < 0 || index > node. Length ( ) {
return
}
if index == node. Length ( ) {
node. InsertByTail ( Data)
return
}
newNode := new ( LinkNode)
newNode. Data = Data
newNode. Next = nil
for i := 0 ; i < index- 1 ; i++ {
node = node. Next
}
newNode. Next = node. Next
node. Next = newNode
}
按位置删除
func ( node * LinkNode) DeleteByIndex ( index int ) {
if node == nil {
return
}
if index < 0 || index > node. Length ( ) {
return
}
preNode := node
for i := 0 ; i < index; i++ {
preNode = node
node = node. Next
}
preNode. Next = node. Next
node. Data = nil
node. Next = nil
node = nil
}
按数据删除
func ( node * LinkNode) DeleteByData ( Data interface { } ) {
if node == nil || Data == nil {
return
}
preNode := node
for node. Next != nil {
preNode = node
node = node. Next
if reflect. TypeOf ( node. Data) == reflect. TypeOf ( Data) && reflect. DeepEqual ( node. Data, Data) {
preNode. Next = node. Next
node. Data = nil
node. Next = nil
node = nil
return
}
}
}
按数据查找结点
func ( node * LinkNode) SearchByData ( Data interface { } ) int {
if node == nil || Data == nil {
return - 1
}
i := 0
for node. Next != nil {
i++
node = node. Next
if reflect. TypeOf ( node. Data) == reflect. TypeOf ( Data) && reflect. DeepEqual ( node. Data, Data) {
return i
}
}
return - 1
}
销毁链表
func ( node * LinkNode) Destroy ( ) {
if node == nil {
return
}
node. Next. Destroy ( )
node. Data = nil
node. Next = nil
node = nil
}
比较顺序表与链式表
顺序表(切片):内存连续
链式表(链表):散乱存储
双向链表
结点数据结构
type LinkNode struct {
Data interface { }
Prev * LinkNode
Next * LinkNode
}
双向链表方法:
创建链表 Create(数据) 打印链表 Print() 获取结点个数 Length() int 插入结点 Insert(index, 数据) 删除结点 Delete(index) 销毁链表 Destroy()
创建双向链表 Create()
容错 创建头结点 head = node 遍历 Data 参数列表,依次创建新结点。 初始化
newNode.Prev = node node.Next = newNode node = node.Next 还原头结点
type LinkNode struct {
Data interface { }
Prev * LinkNode
Next * LinkNode
}
func ( node * LinkNode) Create ( Data ... interface { } ) {
if node == nil || Data == nil {
return
}
if len ( Data) == 0 {
return
}
head := node
for _ , v := range Data {
newNode := new ( LinkNode)
newNode. Data = v
newNode. Prev = node
newNode. Next = nil
node. Next = newNode
node = node. Next
}
node = head
}
链表打印 Print()
正序打印 – 递归
容错,递归出口 判断 node.Data 不为空,打印数据 递归调用 本函数。
func ( node * LinkNode) Print1 ( ) {
if node == nil {
return
}
if node. Data != nil {
fmt. Print ( node. Data, " " )
}
node. Next. Print1 ( )
}
倒序打印 – 循环
容错 找到链表尾结点,保存在 node 中 循环,从链表的尾结点开始,使用 prev ,依次向前打印
判断 node.Data 不为空,打印数据
func ( node * LinkNode) Print2 ( ) {
if node == nil {
return
}
for node. Next != nil {
node = node. Next
}
for node. Prev != nil {
if node. Data != nil {
fmt. Print ( node. Data, " " )
}
node = node. Prev
}
}
按位置插入结点 InsertByIndex()
容错 定义 preNode 用来保存 index 对应的前一个结点 循环 移动 node、preNode。 循环结束时, node 保存 index 对应结点。 创建新结点, 初始化
数据域初始化 新结点的 Prev, 是 preNode 新结点的 Next,是 node node 的Prev 指向 新结点 preNode 的 Next 指向 新结点。
func ( node * LinkNode) InsertByIndex ( index int , Data interface { } ) {
if node == nil || Data == nil {
return
}
if index < 0 || index > node. Length ( ) {
return
}
preNode := node
for i := 0 ; i < index; i++ {
preNode = node
node = node. Next
}
newNode := new ( LinkNode)
newNode. Data = Data
newNode. Prev = preNode
newNode. Next = node
node. Prev = newNode
preNode. Next = newNode
}
按位置删除结点 DeleteByIndex()
容错 定义preNode , 用来保存 index 对应的前一个结点 循环找到 node 、preNode 将 preNode 的 Next 指向 node 的 Next 将 node 的 下一个结点的 Prev 保存 preNode 置空 摘下的结点,促使GC工作 判断 如果 index 为 链表的 尾结点时
将 尾结点(node)的 前一个结点 (preNode)的Next 置空 将 尾结点 置空 。 促使GC工作
/ 按位置删除链表结点
func ( node * LinkNode) DeleteByIndex ( index int ) {
if node == nil {
return
}
if index < 0 || index > node. Length ( ) {
return
}
l := node. Length ( )
preNode := node
for i:= 0 ; i< index; i++ {
preNode = node
node = node. Next
}
if index == l{
preNode. Next = nil
node. Data = nil
node. Prev = nil
node. Next = nil
node = nil
return
} else {
preNode. Next = node. Next
node. Next. Prev = preNode
node. Data = nil
node. Prev = nil
node. Next = nil
node = nil
}
}