在數據結構的世界中,鏈表(Linked List)?是一種經典的線性結構,它以靈活的插入與刪除能力著稱。鏈表不像數組那樣需要連續的內存空間,而是通過節點指針連接形成一條“鏈”。
本篇我們將使用 Go 語言實現一個單向鏈表,并演示其基本操作,如添加、刪除、查找和遍歷。
一、鏈表簡介
鏈表由多個節點(Node)組成,每個節點包含兩部分:
- ? 數據域(Data):存儲實際數據
- ? 指針域(Next):指向下一個節點的指針
鏈表根據連接方式可分為:
- ? 單向鏈表(單鏈表)
- ? 雙向鏈表(雙鏈表)
- ? 循環鏈表(環形鏈表)
本篇我們聚焦單向鏈表的實現。
二、Go語言實現單向鏈表結構
1. 定義節點結構
package?linkedlisttype?Node[T?any]?struct?{Value?TNext??*Node[T]
}
使用泛型?T
?表示支持任意數據類型。
2. 定義鏈表結構
type?LinkedList[T?any]?struct?{Head?*Node[T]
}
鏈表只需維護一個?Head
?指針,即鏈表的起始節點。
3. 添加節點(尾插法)
func?(l?*LinkedList[T])?Append(value?T)?{newNode?:=?&Node[T]{Value:?value}if?l.Head?==?nil?{l.Head?=?newNodereturn}current?:=?l.Headfor?current.Next?!=?nil?{current?=?current.Next}current.Next?=?newNode
}
4. 遍歷鏈表
func?(l?*LinkedList[T])?Traverse(f?func(T))?{current?:=?l.Headfor?current?!=?nil?{f(current.Value)current?=?current.Next}
}
將遍歷邏輯抽象成接收回調函數的方式,方便打印或處理節點數據。
5. 刪除指定值節點(僅刪除首個匹配項)
func?(l?*LinkedList[T])?Delete(value?T,?equal?func(a,?b?T)?bool)?bool?{if?l.Head?==?nil?{return?false}if?equal(l.Head.Value,?value)?{l.Head?=?l.Head.Nextreturn?true}prev?:=?l.Headcurr?:=?l.Head.Nextfor?curr?!=?nil?{if?equal(curr.Value,?value)?{prev.Next?=?curr.Nextreturn?true}prev?=?currcurr?=?curr.Next}return?false
}
6. 查找節點
func?(l?*LinkedList[T])?Find(value?T,?equal?func(a,?b?T)?bool)?*Node[T]?{current?:=?l.Headfor?current?!=?nil?{if?equal(current.Value,?value)?{return?current}current?=?current.Next}return?nil
}
三、使用示例
package?mainimport?("fmt""linkedlist"
)func?main()?{list?:=?linkedlist.LinkedList[int]{}list.Append(10)list.Append(20)list.Append(30)fmt.Println("遍歷鏈表:")list.Traverse(func(v?int)?{fmt.Println(v)})fmt.Println("查找元素?20:")node?:=?list.Find(20,?func(a,?b?int)?bool?{?return?a?==?b?})if?node?!=?nil?{fmt.Println("找到節點:",?node.Value)}fmt.Println("刪除元素?10:")ok?:=?list.Delete(10,?func(a,?b?int)?bool?{?return?a?==?b?})fmt.Println("刪除成功?",?ok)fmt.Println("再次遍歷鏈表:")list.Traverse(func(v?int)?{fmt.Println(v)})
}
四、進階建議
想進一步提升鏈表的功能?你可以嘗試:
- ? 實現?頭插法?/ 按位置插入
- ? 實現?雙向鏈表
- ? 實現?環形鏈表?并檢測環
- ? 使用?接口封裝?提供更統一的操作抽象
- ? 在鏈表上實現?反轉、合并、中間節點查找?等常見算法
五、總結
通過本篇文章,你應該掌握了:
- ? 鏈表的基本概念與結構
- ? 使用 Go 實現節點與鏈表結構
- ? 實現鏈表的增刪查遍操作
- ? 利用泛型與函數式回調提升代碼通用性與可讀性
鏈表是數據結構中的基礎磚石,理解它對于掌握更復雜結構如棧、隊列、哈希表乃至圖都有極大幫助。