题目
思路
看过之前链表题的题解有用一个哑节点的思路后,我想到了这题也可以用一个哑节点newHead,哑节点的下一个节点指向 head, 先用 res 指针保存newHead 然后用一前一后的双指针去遍历链表,后指针的值如果等于 val, 则满足题意需要删除,则把 前指针的 next 赋值为 后指针的 next,如果不等于的话,则直接把 前后指针都后移一个即可,最后就直接返回 res.next 即可。
代码实现(Java)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return head;
}
ListNode newHead = new ListNode(0,head); //新建一个哑节点
ListNode res = newHead; //res保存答案节点
ListNode next = head; // next 节点指向 head ,也就是哑节点的下一个节点
while(next != null) {
if(next.val == val) {
newHead.next = next.next;
} else {
newHead = next;
}
next = newHead.next;
}
return res.next;
}
}
踩坑
我按照自己的思路写完后提示超时,原来是陷入了死循环,下面这个代码是我踩坑的代码。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
//这个代码是错误的代码,我在此做一个记录罢了!!
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return head;
}
ListNode newHead = new ListNode(0,head);
ListNode res = newHead;
ListNode next = head;
while(next != null) {
if(next.val == val) {
newHead.next = next.next;
//这里漏掉了一行 next = newHead.next;
//所以不管怎样,next始终要赋值成 newHead.next 所以可以直接提到条件体的外面
} else {
newHead = next;
next = newHead.next;
}
}
return res.next;
}
}
官方代码(Java)
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode sentinel = new ListNode(0);
sentinel.next = head;
ListNode prev = sentinel, curr = head;
while (curr != null) {
if (curr.val == val) prev.next = curr.next;
else prev = curr;
curr = curr.next;
}
return sentinel.next;
}
}
对比结果
我的代码提交结果
官网的代码提交结果
坚持分享,坚持原创,喜欢博主的靓仔靓女们可以看看博主的首页博客!
您的点赞与收藏是我分享博客的最大赞赏!
博主博客地址: https://blog.csdn.net/weixin_43967679