Leetcode题解——203. 移除链表元素

115 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

题解思路

这是一道简单题,是关于链表的。根据题目意思,我们需要根据给定的元素,移除与给定元素相同的链表节点。因为链表是不支持随机访问的,所以我们只能通过遍历整个链表挨个比较与给定元素的数值大小。这道题目充分利用了链表的特性。理解并且使用链表的前后节点的关联性的关键概念是解题的关键的。那么我们来描述完整的解题思路:

采用迭代的方式,首先确立两个节点:当前节点以及当前节点的上一节点,如果当前节点的val与需移除的val相等时,将当前节点移除,即将上一节点的下一节点指向当前节点的下一节点,当前节点置为当前节点的下一节点,这里有种临界情况:头节点的val就为需要排除的val,此时便将头节点向后移动至下一节点即可。val不相等的情况,就将上一节点置为当前节点,当前节点的下一节点置为当前节点即可。最后,返回头节点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode current = head;
        ListNode prev = null;
        while(current != null) {
            if (current.val == val) {
                if (prev == null) {
                    current = current.next;
                    head = current;
                } else {
                    prev.next = current.next;
                    current = current.next;
                }
            } else {
                prev = current;
                current = current.next;
            }
        }

        return head;
    }
}

复杂度分析

时间复杂度:O(n),因为我们在整个题解中只有遍历链表一次的,所以n就是代表我们遍历的链表长度的。
空间复杂度:因为我们在整个算法中只有使用常数级的额外空间的,并不随着循环的运行而增长。所以空间复杂度就是O(1).

总结

虽然这是一道简单题,但是凸显了链表的特性,也是加深概念的好题目的。