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
输出: []
思路:
首先是要记住如何构造一个链表,JS 构造方式
function ListNode(val, next) {
this.val = (val===undefined ? 0 : val)
this.next = (next===undefined ? null : next)
}
接着,有两种删除链表方法,分别是直接删除和采用虚拟头节点来删除,由于 JS 定义的链表默认可以填入 head
和 head. next
,所以采用虚拟头节点来删除。其次,要定义一个指针用来指向实例对象 result
,设为 cur
,cur
和 result
共享一个实例对象,内存地址相同。接着,先要判断 cur. next
是否有值,以防空指针操作,然后通过 cur. next. val===val
的判断来是否要删除节点,之后通过将 cur. next
的指针指向 cur. next. next
来实现节点的删除,如果不是要删除的节点,则要将 cur
移向 cur. next
,由于整体的逻辑是一个不断执行的操作,所以循环体采用 while
。
var removeElements = function(head, val) {
let result = new ListNode(0,head)
let cur = result
while(cur.next !== null){
if(cur.next.val === val){
cur.next = cur.next.next
}else{
cur = cur.next
}
}
return result.next
};
707. 设计链表
(待补充)
206. 反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入: head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入: head = [1,2]
输出:[2,1]
示例 3:
输入: head = []
输出:[]
思路:
双指针法
采用两个指针来进行遍历,第一个 cur
指向当前链表的头节点,第二个指针 pre
初始值为 null
,因为 cur
的指向的头节点最后会因为链表的反转变成为尾节点,最后会指向 null
。接着,每进行一次反转,都需要将两个节点向前移动,并且重新赋值,需要将 cur
指向它的下一个节点 cur. next
,pre
需要指向移动前的 cur
,所以需要一个中间节点来存储 cur. next
,并根据顺序进行重新赋值,根据 cur
是否指向 null
来判断循环的结束,由于当 cur
指向 null
的时候,pre
指向的“尾节点”在这个时候就是头节点,所以 return pre
即可。
var reverseList = function(head) {
let dummyhead = new ListNode(0,head) // 必须用dummyhead才能进行第一个节点的操作
cur = dummyhead.next
let pre = null
while(cur){
let temp = cur.next
cur.next = pre
pre = cur
cur = temp
}
return pre
};
递归法
方法和双指针法差不多,只是要创建一个新的函数。在函数中要进行 cur 的判断,如果 cur 为 null 要 return pre,递归是要不断 return 才能产生递归,如果没有 return
functon reverse(cur,pre){
if(cur===null) return pre
let temp = cur.next
cur.next = pre
return reverse(temp,cur)
}
var reverseList = function(head) {
let cur = new ListNode(0,head)
cur = cur.next
reverse(cur,null)
};
237. 删除链表中的节点
题目:
有一个单链表的 head
,我们想删除它其中的一个节点 node
。
给你一个需要删除的节点 node
。你将 无法访问 第一个节点 head
。
链表的所有值都是 唯一的,并且保证给定的节点 node
不是链表中的最后一个节点。
删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:
- 给定节点的值不应该存在于链表中。
- 链表中的节点数应该减少 1。
node
前面的所有值顺序相同。node
后面的所有值顺序相同。
自定义测试:- 对于输入,你应该提供整个链表
head
和要给出的节点node
。node
不应该是链表的最后一个节点,而应该是链表中的一个实际节点。 - 我们将构建链表,并将节点传递给你的函数。
- 输出将是调用你函数后的整个链表。
- 示例 1:
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释: 指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为4 -> 1 -> 9
示例 2:
输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释: 指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为4 -> 5 -> 9
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
var deleteNode = function(node) {
node.val =node.next.val
node.next = node.next.next
};