题目链接:https://leetcode.com/problems/remove-linked-list-elements/
题目:
val.
Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return:
思路:
链表增删操作都需要考虑删、增的是第一个结点的时候该怎么办,使得对表头操作和中间结点的操作不统一,需要特殊处理。
如果有头结点就可以省略判断如果删、增的是表头的情况,简化程序。
算法1:无头结点
public ListNode removeElements(ListNode head, int val) {
ListNode pre, p;
pre = head;
p = head;
while (p != null) {
if (p.val == val) {
pre.next = p.next;
p = p.next;
} else {
pre = p;
p = p.next;
}
}
// 处理第一个节点如果等于val的情况
if (head == null) {
return null;
} else if (head.val == val) {// 如果删除的是第一个节点
head = head.next;
}
return head;
}
算法2:有头结点时
public ListNode removeElements(ListNode head, int val) {
ListNode pre, p;
ListNode newHead = new ListNode(0);
newHead.next = head;
pre = newHead;
p = newHead.next;
while (p != null) {
if (p.val == val) {
pre.next = p.next;
} else {
pre = p;
}
p = p.next;
}
return newHead.next;
}