203. 移除链表元素
解题思路
链表
删除节点: node.next = node.next.next
移动指针: node = node.next
代码
var removeElements = function(head, val) {
//这边需要使用 while 进行判断,可能是 1,1,1
while(head!=null && head.val == val){
head = head.next;
}
//cur 初始值是 head,主要是为了删除第二个元素,只需要第一个的 next 指向第三个的 next
var cur = head;
while(cur != null && cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return head;
};
虚拟头节点
主要是使得处理头节点和其他节点的操作一致
虚拟头节点:主要用来解决在链表中添加节点和删除节点相关的问题
代码
var removeElements = function(head, val) {
//通过在链表前面添加虚拟头节点,使得处理第一个节点和其他节点的操作一致
var dummyhead = new ListNode();
//将 dummyhead.next 指向 head,即在head 前添加虚拟头节点
dummyhead.next = head;
//cur 节点指向 dummyhead,主要是如果第一个符合的话,就直接删除第一个节点
var cur = dummyhead;
while(cur.next !== null){
if(cur.next.val === val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummyhead.next
};
707.设计链表
206.反转链表
解题思路
双指针
使用双指针解决数组翻转问题
代码
var reverseList = function(head) {
var cur = head,
pre = null,
temp;
while(cur){
//temp 存储下一个节点的位置
temp = cur.next;
cur.next = pre;
// pre 向后移动一个节点
pre = cur;
//cur 指向下一个节点
cur = temp;
}
return pre;
};
递归解法
其实递归就是利用了双指针的解法思路
var reverse = function(cur,pre){
// 终止条件
if(cur == null){
return pre;
}
var temp = cur.next;
cur.next = pre;
return reverse(temp,cur);
}
var reverseList = function(head) {
return reverse(head,null);
};