mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 23:28:29 +08:00
设计链表 没有Go单链表的实现只有循环双链表 添加单链表实现便于理解
This commit is contained in:
@ -652,6 +652,106 @@ class MyLinkedList:
|
|||||||
|
|
||||||
Go:
|
Go:
|
||||||
|
|
||||||
|
```go
|
||||||
|
//单链表实现
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var list = new(SingleLinkedList)
|
||||||
|
list.Init()
|
||||||
|
list.addAtHead(100)
|
||||||
|
list.addAtTail(242)
|
||||||
|
list.addAtTail(777)
|
||||||
|
list.addAtIndex(1, 99999)
|
||||||
|
list.printLinkedList()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单链表写法 //
|
||||||
|
|
||||||
|
type SingleNode struct {
|
||||||
|
Val int
|
||||||
|
Next *SingleNode
|
||||||
|
}
|
||||||
|
|
||||||
|
type SingleLinkedList struct {
|
||||||
|
dummyHead *SingleNode
|
||||||
|
Size int
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化链表
|
||||||
|
func (list *SingleLinkedList) Init() *SingleLinkedList {
|
||||||
|
list.Size = 0
|
||||||
|
list.dummyHead = new(SingleNode)
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取第index个节点数值
|
||||||
|
func (list *SingleLinkedList) get(index int) int {
|
||||||
|
if list != nil || index < 0 || index > list.Size {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
// 让cur等于真正头节点
|
||||||
|
cur := list.dummyHead.Next
|
||||||
|
for i := 0; i < index; i++ {
|
||||||
|
cur = cur.Next
|
||||||
|
}
|
||||||
|
return cur.Val
|
||||||
|
}
|
||||||
|
|
||||||
|
// 在链表最前面插入一个节点
|
||||||
|
func (list *SingleLinkedList) addAtHead(val int) {
|
||||||
|
// 以下两行代码可用一行代替
|
||||||
|
// newNode := new(SingleNode)
|
||||||
|
// newNode.Val = val
|
||||||
|
newNode := &SingleNode{Val: val}
|
||||||
|
|
||||||
|
newNode.Next = list.dummyHead.Next
|
||||||
|
list.dummyHead.Next = newNode
|
||||||
|
list.Size++
|
||||||
|
}
|
||||||
|
|
||||||
|
// 在链表最后面插入一个节点
|
||||||
|
func (list *SingleLinkedList) addAtTail(val int) {
|
||||||
|
newNode := &SingleNode{Val: val}
|
||||||
|
cur := list.dummyHead
|
||||||
|
for cur.Next != nil {
|
||||||
|
cur = cur.Next
|
||||||
|
}
|
||||||
|
cur.Next = newNode
|
||||||
|
list.Size++
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打印链表
|
||||||
|
func (list *SingleLinkedList) printLinkedList() {
|
||||||
|
cur := list.dummyHead
|
||||||
|
for cur.Next != nil {
|
||||||
|
fmt.Println(cur.Next.Val)
|
||||||
|
cur = cur.Next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 在第index个节点之前插入新节点
|
||||||
|
func (list *SingleLinkedList) addAtIndex(index int, val int) {
|
||||||
|
if index < 0 {
|
||||||
|
index = 0
|
||||||
|
} else if index > list.Size {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newNode := &SingleNode{Val: val}
|
||||||
|
cur := list.dummyHead //用虚拟头节点不用考虑在头部插入的情况
|
||||||
|
for i := 0; i < index; i++ {
|
||||||
|
cur = cur.Next
|
||||||
|
}
|
||||||
|
newNode.Next = cur.Next
|
||||||
|
cur.Next = newNode
|
||||||
|
list.Size++
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
```go
|
```go
|
||||||
//循环双链表
|
//循环双链表
|
||||||
type MyLinkedList struct {
|
type MyLinkedList struct {
|
||||||
|
Reference in New Issue
Block a user