问题:
Remove all elements from a linked list of integers that have value val.
Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5
大意:
移除链表中素有值为val的元素。
例子:
给出: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
返回: 1 --> 2 --> 3 --> 4 --> 5
思路:
这道题没什么特殊的,遍历链表遇到值跟val相同的就删除节点就好,链表删除节点的做法也比较固定了,只是要细心一点不要漏了什么特殊情况,比如删除节点时是最后一个节点的处理、链表头部连续出现要删除的节点时的处理等等,另外因为最终要返回的是头结点,所以这个节点要有一个变量去保留着最后返回。
我的做法是先把头部的连续的目标节点都删掉,然后遍历链表,中间遇到了就删,当然遇到时要判断是不是最后一个节点了,是的话就next直接指向null了。在删头结点时,因为可能循环着遇到后面没节点了的情况,比如 1 --> 1 这种全部要删除的,所以在循环条件中利用 && 运算符的特性,先判断节点存在,然后再判断值,如果节点不存在,第一个判断条件就无效,那么就不会处理第二个判断条件,否则直接判断值有可能在无节点时报错。
代码(Java):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) return head;
ListNode result = head;
while (result != null && result.val == val) result = result.next;
while (head.next != null) {
if (head.next.val == val) {
if (head.next.next != null) head.next = head.next.next;
else head.next = null;
} else {
head = head.next;
}
}
return result;
}
}
合集:https://github.com/Cloudox/LeetCode-Record