203.移除链表元素
题目链接: 203.移除链表元素
参考文档:代码随想录
状态:已完成,耗时一小时
思路:很基础的移除链表元素的题目。当target在头节点时,将头节点指针往后移即可;当target在头节点之后的元素时,则将当前元素的next指向next.next即可。为了统一以上两种操作,可以创建一个头节点插在链表最前面,这样的话,原链表所有元素都在新建头节点之后了。
错误写法:
var removeElements = function(head, val) {
const ret = new ListNode(0, head);
let current = ret;
while(current.next){
if(val === current.next.val){
current.next = current.next.next;
}
current = current.next;
}
return ret.next;
};
这种写法存在一个问题:如果链表最后的节点的val等于target,本次循环执行到最后,current会等于null。这样进行下次循环。
正确解法:
var removeElements = function(head, val) {
const ret = new ListNode(0, head);
let current = ret;
while(current.next){
if(val === current.next.val){
current.next = current.next.next;
continue;
}
current = current.next;
}
return ret.next;
};
在if循环中加continue,当链表最后一个元素的val等于target时,便把该元素删除,此时,current.next === null,下次判断while循环时便会停止循环。
不过我觉得leetcode上官方解法更好理解些:
var removeElements = function(head, val) {
const ret = new ListNode(0, head);
let current = ret;
while(current.next){
if(val === current.next.val){
current.next = current.next.next;
}
else{
current = current.next;]
}
return ret.next;
};
这里的思路是:如果current.next等于target,则先删除current.next节点;如果current.next不等于target,则将指针往后移。
206.反转链表
题目链接: 206.反转链表
参考文档:代码随想录
状态:已完成,耗时两小时,
思路1:使用迭代法,代码如下:
let pre = null;
let cur = head;
if(cur==null) return head;
let temp = head.next;
while(cur!==null){
cur.next = pre;
pre = cur;
cur = temp;
if(temp!=null){
temp = temp.next;
}
}
return pre;
思路2:使用递归法,代码如下:
var reverseList = function(head) {
if(head === null || head.next === null){
return head;
}
let ret = reverseList(head.next);
head.next.next = head;
head.next = null;
return ret;
};
贴上递归法的参考文章链接:https://leetcode.cn/problems/reverse-linked-list/solutions/99711/fan-zhuan-lian-biao-shuang-zhi-zhen-di-gui-yao-mo-/
707.设计链表
题目链接: 707.设计链表
参考文档:代码随想录
状态:未完成,后续会补上
原因:每个函数都不好debug,很难把握问题出在哪,以及如何写更好