简单的讲解移除链表元素(包含思路及完整代码)

12 阅读2分钟

题目要求

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

图解

配合思路过程一起看更容易理解

思路过程

1.删除链表中所有满足的Node.val==val的节点?

怎么删除?

删除思路: 假设我们删除val=2的节点,那么我们首先就要遍历整个链表,其次删除2就等同于把1指向3,然后3也要指向5。

删除方法: 使1的next指向3的地址(也就是2的next)

prev. next = cur. next//删掉了一个2

cur = cur. next;//再往后面看还有没有2,也就是继续遍历的意思

2.思路过程中又出现了一些小问题:

prev怎么求?遍历怎么停下来?删除的是第一一个节点prev怎么来........

我们一步一步来

prev怎么求?删除的是第一一个节点prev怎么来?

直接从第二个节点开始考虑,第一个节点作为特殊节点特殊考虑。此时

NodeList prev = head;//头节点给prev

NodeList cur = head. next;//第二个节点给head

遍历怎么停下来?

while ( cur != null) ;当cur = nul1的时候就是val =5的时候next给

的,此时就代表遍历结束了。

当删除第一个节点该怎么办?

直接进行判断是不是删第一个节点,也就是头结点,如果是把头节点甩给下一个节点。

if(head.val == key) head = head.next;

如果只有一个节点要删吗?

只有一个节点就不能删了,做人要留一线,此时就代表只剩一个头结点了。

**if(head == null) return null;

完整代码

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null) {
            return null;
        }
        ListNode prev = head;
        ListNode cur = head.next;
        
        while (cur != null) {
            if(cur.val == val) {
                prev.next = cur.next;
                cur = cur.next;
            } else {
                prev = cur;
                cur = cur.next;
            }
        }
        //对头结点为val进行判断
        if(head.val == val) {
            head = head.next;
        }
        return head;
    }
}