# 链表删除节点

存在一个链表,填表的结构为:
type ListNode struct {
Val int
Next *ListNode
}
1
2
3
4
2
3
4
需要删除链表中的某个节点,提供头节点与需要删除的节点。
# 函数返回值
func deleteNode(head, deleteNode *ListNode) {
// do delete ...
}
1
2
3
2
3
- 删除函数接收链表头节点与删除节点,那么这个函数需要有返回值吗?为什么?
- 需要,因为如果删除了头节点,那么需要将新的头节点返回
# 不提供头节点删除
不提供头节点可以删除链表中的某个值吗?
可以采用值拷贝的方式删除

无法删除最后一个节点,因为删除最后一个节点需要将上一个节点的引用指向空

一些工程场景无法使用值拷贝,如一个节点的值与服务器相绑定,且服务器与被其他服务依赖

值拷贝代码删除节点示例
import (
"fmt"
"testing"
)
func TestDeleteNode(t *testing.T) {
// 初始化一个链表
head := &ListNode{Val: 5}
head.Next = &ListNode{Val: 20}
head.Next.Next = &ListNode{Val: 1}
head.Next.Next.Next = &ListNode{Val: 20}
head.Next.Next.Next.Next = &ListNode{Val: 5}
oneNode := head.Next.Next // 仅删除1节点
cur, next := oneNode, oneNode.Next
for next.Next != nil {
cur.Val = next.Val // 拷贝next值到删除节点
cur = cur.Next
next = next.Next
}
cur.Val = next.Val
cur.Next = nil // 最后节点需要设置为nil
for head != nil {
fmt.Println(head.Val)
head = head.Next
}
// 采用值拷贝的方式成功删除
//=== RUN TestDeleteNode
//5
//20
//20
//5
//--- PASS: TestDeleteNode (0.00s)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
← 二叉树-9-按层遍历 链表-1-反转链表 →