引言
本文主要讲解链表操作的两个经典问题:移除指定值节点和反转链表。对于链表的操作重点在于指针的使用,这两道题都需要用到指针,不过一个是单指针,一个是双指针,其中有一些异同点,因此放在一起分析。
下文会先分别讲解这两道题,最后放在一起总结。
移除链表元素
题目描述
给你一个链表的头节点 head 和一个整数 val,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点。
示例 1
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2
输入:head = [], val = 1 输出:[]
示例 3
输入:head = [7,7,7,7], val = 7 输出:[]
解题思路
这道题本身思路很简单,用指针遍历链表中的每一个节点。
- 若节点值不等于
val则什么也不用做,改变指针指向下一个节点即可。 - 若节点值等于
val,需要控制节点的next指针跳过紧挨的下一个节点。
需要注意的是,用单指针就可以解决而不用用双指针。
若用双指针,p 指向当前节点,pnext 指向下一个节点,则 pnext.val==val 时: p.next=pnext.next,pnext=pnext.next
若用单指针,p 指向某一节点,则 p.next.val==val 时: p.next=p.next.next 即可
显然用单指针是更高效的。
另外,为了避免判断头节点是否为空,以及头节点是否需要删除等复杂的异常情况,设计一个虚头节点,就可以实现操作的统一,具体实现代码如下。
代码
from typing import Optional
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
virtualNode = ListNode(0, head) # 虚的头节点
p = virtualNode
p.:
p..val == val:
p. = p..
:
p = p.
virtualNode.


