删除链表专题复盘(上一期的深入思考)

一、LeetCode203.移除链表元素

重要的点:创建虚拟头结点,辅助做题。
ListNode dummyHead = new ListNode(0);

结尾:return dummyHead.next;
因为头结点也可能被删除了

写完这题,我不禁思考,什么样的题目需要我们创建虚拟头结点?

这个疑问,也许会在后续的刷题中被慢慢解答。

二、LeetCode19.删除链表倒数第N个节点

一)方法一:

如果题目中有N这个数字,我们通常可以考虑到双指针,这道题就可以这么做

首先,ListNode fast = head, slow = head;

先让fast走N步,再让fast和slow一起走,走到链表的尾端

这里有个值得注意的点是,既然是走到尾端,那么你while循环结束的条件是什么?

画图理解,就是while(fast.next != null)

循环结束时,slow的下一个节点,就是要删除的节点了

我们就让slow.next = slow.next.next;

好像over了

回过头来看这道题,我们发现有个逻辑漏洞,假设我们链表只有一个节点,而我们要删除的就是头节点,怎么办?

所以要在while循环前面加上if条件判定

if(fast == null)
    return head.next;

这下是over了

二)方法二:

还有个普通的方法,就是直接计算链表长度

先遍历一遍得到长度,而length - N + 1 就是要删除的点

再从头走一次,走到那把它删掉就行,这里就不写代码来赘述了

三、LeetCode83.删除排序链表中的重复元素 I(保留一个元素)

首先,ListNode cur = head;

思路就是遍历一遍,逐一比较当前节点与下一个节点的val是否相同

相同删掉(cur.next = cur.next.next)
不同继续走(cur = cur.next)

while循环结束的条件是 cur.next != null

到此为止,代码还有个不易察觉的漏洞,非常值得注意,也同时是我们做链表的时候要经常注意的事情

!!!空指针问题

在循环之前要先判定

if(head == null){
    return head;
}

否则ListNode cur = head; 这么搞一下,cur岂不成空指针了?

四、LeetCode82.删除排序链表中的重复元素 II(重复元素都删)

只要重复元素就都删,那么head节点也有被删除的可能了

因此要用到虚拟头节点dummy

ListNode dummy = new ListNode(0, head);

ListNode cur = dummy; 这个cur节点拿来遍历

老样子,先判断 if(head == null)

接着while(cur.next != null && cur.next.next != null)

如果前后两节点的数据相等,int x ,把val的值赋给x

再while循环,凡事val与x相等就删除

不相等,cur = cur.next

遍历完成后,return dummy.head;

这题难度水平中级,思路稍微复杂了点,要注意的小细节也很多,以我现在的功力可能解释的还不是很清楚,各位多多海涵~


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值