卡尔 代码随想录讲解视频
LeetCode:203.移除链表元素
实现方式:使用dummy head虚拟头结点
使用dummy head虚拟头结点是为了统一删除头结点和删除非头结点的方式
public class ListNode {
private int val;
private ListNode next;
public ListNode() {}
public ListNode(int val) {
this.val = val;
}
// 删除值为value的结点,返回链表头结点
public ListNode removeElements(ListNode head, int value) {
// 使用dummy head 的方式删除
// 1.新增dummy head
// 2.使用临时结点cur遍历链表,cur要从dummy head开始因为删的有可能是头结点(删某个节点要知道它的上一个结点)
// 3.while遍历 找到结点就删除,找不到的话cur就继续变成下个结点
// 4.返回头结点(注意此处不能直接返回head 而要返回current.next)
// add dummy head
ListNode dummyHead = new ListNode();
dummyHead.next = head;
// 借助临时结点遍历,要把头结点预留出来,因为有可能删的就是头结点
ListNode cur = new ListNode();
cur = dummyHead;
// 不知道这个while条件写对没有:应该写对了。因为防住了后面的代码报空指针
while(cur != null && cur.next != null) {
if(cur.next.val == value) {
cur.next = cur.next.next;
} else{
cur = cur.next;
}
}
// 返回头指针:注意,此时虚拟结点的后一个结点才是真正意义的头指针(因为原来的头可能被删除啦
return dummyHead.next; // 不是return head!!
}
public static void main(String[] args) {
// 构造一个头结点为listNode1的链表,方便测试
ListNode listNode1 = new ListNode(3);
ListNode listNode2 = new ListNode(4);
ListNode listNode3 = new ListNode(5);
ListNode listNode4 = new ListNode(6);
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
// 删掉非头结点
ListNode listNode = new ListNode().removeElements(listNode1, 5);
// 删掉头结点
ListNode resultHead = new ListNode().removeElements(listNode1, 3);
System.out.println(resultHead);
}
}