力扣(LeetCode)刷题:移除链表元素

93 阅读1分钟

203. 移除链表元素

给你一个链表的头节点 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
输出: []

 

提示:

  • 列表中的节点数目在范围 [0, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

题解:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
//  常规链表的循环遍历操作
// 小技巧: 设置一个哨兵元素,可以安全的操作,不用去head是不是会被移除了。
// 哨兵=>1=>2=>3 
// return 哨兵.next

// 时间复杂度:O(n), 其中 n 是链表的长度, 需要遍历链表一次。
// 空间复杂度:O(1)
// var removeElements = function(head, val) {
//     let ele = {
//         next: head
//     }
//     let p = ele;
//     while(p.next){
//         if(p.next.val === val ) {
//             p.next = p.next.next
//         } else {
//             p = p.next;
//         }
//     }
//     return ele.next;
// };

// 递归方式
// 时间复杂度:O(n),其中 n 是链表的长度。递归过程中需要遍历链表一次。
// 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用栈,一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息
var removeElements = function(head, val) {
    if(head === null) {
        return head;
    }
    head.next = removeElements(head.next, val);
    return head.val === val ? head.next: head;
};