# 链表删除节点

存在一个链表,填表的结构为:

type ListNode struct {
	Val  int
	Next *ListNode
}
1
2
3
4

需要删除链表中的某个节点,提供头节点与需要删除的节点。

# 函数返回值

func deleteNode(head, deleteNode *ListNode)  {
   // do delete ...
}
1
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/5/2024,