我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第7篇文章 点击查看文章详情 🚀🚀
203. 移除链表元素 - 力扣(LeetCode)
难度:🔥🔥
给你一个链表的头节点 head和一个整数 val请你删除链表中所有满足
Node.val == val的节点并返回新的头节点 。
输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]
不设置虚拟头结点
if(!head) return head;
//1.该结点为头结点,针对7777的情况所以用while
while(head!== null && head.val === val) head = head.next;
//2.该结点不是头结点
let cur = head;//方便找到要删除结点node的前一个prev,让prev指向node.next
while(cur && cur.next)//避免对空指针进行操作
{
if(cur.next.val === val){
cur.next = cur.next.next;
}
else
cur = cur.next;
}
return head
设置虚拟头结点
const ret = new ListNode(0, head);
let cur = ret;
while(cur.next) {
if(cur.next.val === val) {
cur.next = cur.next.next;
continue;
}
cur = cur.next;
}
return ret.next;
难点
为什么要设置虚拟头结点?
我的理解是,为了更好的对链表进行一个统一的操作
不设置虚拟头结点时,要对链表的头结点进行一个单独的处理
设置了虚拟头结点时,则不需要考虑。
小心对空指针进行操作导致报错
尤其是目标值为链表最后一项时,如果写了两层next,就会因为导致对空指针进行了操作而报错。
返回值问题
什么时候返回head?
什么时候返回其他?
我的理解是,返回其他 =>
虚拟头结点的next更加稳妥因为针对7777 target=7 情况,直接返回
head,会导致直接按原链表进行输出
707. 设计链表 - 力扣(LeetCode)
难度:🔥🔥🔥🔥🔥
这道题,我不是被算法卡死了,我是被es6语法卡死了~ 😡😡
暂时先搁置一旁吧,害~
206. 反转链表 - 力扣(LeetCode)
难度:🔥🔥
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
var reverseList = function(head) {
if(!head) return head;
let cur = head;
let pre = null;
while(cur){
let next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
};
难点
这题比较简单,但还是要注意:
pre不要习惯性的设置成结点,它仅仅只是链表中的一个位置
设成结点的话会直接改变结点的长度
收获
先谈谈自己的不足吧
第一题和第三题都是前不久才刚刷过的题,结果第一遍还是不能拿下~
菜是真的菜呀。。。。
第一题
- 一不小心就对空指针进行了操作,导致控制台报错
- 返回的值还不是很清楚
第二题
设计链表
都怪es6基础不太好,愣是看不懂class类里面的this~
第三题
我直接给pre设置成结点了
会被自己蠢哭~
好在又对这些题目加深了一些自己的理解。
也算是有不少的收获
待明日的太阳升起,又是元气满满的一天~
⭐⭐⭐