解题思路
依然是双指针,添加一个哨兵节点以方便处理头指针处的数据。
Java代码
一开始写的时候不知道如何处理头节点被删除后的返回值,捣鼓了半天分支条件,如下所示:
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode guard = new ListNode(0);
guard.next = head;
ListNode prep = guard, cur = head;
while (cur != null) {
if (cur.val == val) {
prep.next = prep.next.next;
if (prep == guard) head = head.next; //如果操作的是头节点,头节点向后移动一位
}
else {
prep = prep.next;
}
cur = cur.next;
}
return prep == guard ? prep.next : head; //判定返回的是否是头节点
}
}
看了题解之后才发现,可以直接再次利用哨兵节点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode guard = new ListNode(0);
guard.next = head;
ListNode prep = guard, cur = head;
while (cur != null) {
if (cur.val == val) prep.next = cur.next;
else prep = prep.next;
cur = cur.next;
}
return guard.next; //妙啊
}
}