package com.lianbiao.java;
//203.移除链表元素
public class one {
/*
* 总结:
* 主要是考虑头结点的处理:
* 1.可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了
* 2.不添加虚结点方法,头结点单独处理
*/
//方法一:添加虚结点方法
public ListNode removeElements(ListNode head, int val) {
if(head == null) {//链表为空
return head;
}
// 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
ListNode dummy = new ListNode(-1, head);
ListNode pre = dummy;//定义一个辅助指针pre 紧紧跟着cur
ListNode cur = head;//cur从head开始从前向后遍历
while(cur != null) {
if(cur.val == val) {
pre.next = cur.next;
}else {
pre = cur;//其实就是使得pre向前走,且紧跟着cur
}
cur = cur.next;
}
return dummy.next;//注意dummy只是添加的一个虚结点,真正要返回的是dummy.next
}
//方法一:不添加虚结点方法
public ListNode removeElements1(ListNode head, int val) {
//首先处理头结点
while(head != null && head.val == val) {//如果头结点就是val
head = head.next;
}
//已经为null,提前退出
if(head == null) {
return head;
}
//已确定head.val不为空且 != val
ListNode pre = head;//定义辅助指针
ListNode cur = head.next;
while(cur != null) {
if(cur.val == val) {
pre.next = cur.next;
}else {
pre = cur;
}
cur = cur.next;
}
return head;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}