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