203. Remove Linked List Elements
难度: Easy
刷题内容
原题连接
内容描述
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
解题方案
思路 1 - 时间复杂度: O(3N)
- 空间复杂度: O(2N)
暴力解法:
- 将链表转化为数组
- 对数组进行过滤
- 将过滤后的数组重新转化为数组
执行用时 :160 ms, 在所有 JavaScript 提交中击败了10.71%的用户
内存消耗 :38.4 MB, 在所有 JavaScript 提交中击败了5.13%的用户
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var removeElements = function(head, val) {
if (!head) {
return head
}
let array = listNodeToArray(head)
array = array.filter(i => (i !== val))
return arrayToListNode(array)
};
function listNodeToArray (head) {
let array = []
while (head) {
array.push(head.val)
head = head.next
}
return array
}
function arrayToListNode(array) {
if(!array || !array.length) {
return null
}
let node
let head = new ListNode(array[0])
let pnode = head //pnode变量用来保存前一个节点
for(let i = 1; i < array.length; i++) {
node = new ListNode(array[i])
pnode.next = node //将前一个节点的next指向当前节点
pnode = node //将node赋值给pnode
}
return head
}
思路 2 - 时间复杂度: O(N)
- 空间复杂度: O(1)
快慢指针:
- 快指针(
head
)每次循环都向前移动一个 - 慢指针(
slow
)只有在快指针当前节点的值不等于给定值时,才会向前移动,并在此之前将快指针当前节点指向慢指针的next
执行用时 :108 ms, 在所有 JavaScript 提交中击败了77.37%的用户
内存消耗 :37.9 MB, 在所有 JavaScript 提交中击败了11.11%的用户
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var removeElements = function(head, val) {
if (!head) {
return head
}
let slow = new ListNode()
let result = slow
while (head) {
if (head.val !== val) {
slow.next = head
slow = slow.next
} else if (!head.next) {
slow.next = null
}
head = head.next
}
return result.next
};