問題:
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相同的就刪除節(jié)點(diǎn)就好授翻,鏈表刪除節(jié)點(diǎn)的做法也比較固定了杆煞,只是要細(xì)心一點(diǎn)不要漏了什么特殊情況,比如刪除節(jié)點(diǎn)時(shí)是最后一個(gè)節(jié)點(diǎn)的處理抖僵、鏈表頭部連續(xù)出現(xiàn)要刪除的節(jié)點(diǎn)時(shí)的處理等等立倍,另外因?yàn)樽罱K要返回的是頭結(jié)點(diǎn),所以這個(gè)節(jié)點(diǎn)要有一個(gè)變量去保留著最后返回为肮。
我的做法是先把頭部的連續(xù)的目標(biāo)節(jié)點(diǎn)都刪掉,然后遍歷鏈表肤京,中間遇到了就刪颊艳,當(dāng)然遇到時(shí)要判斷是不是最后一個(gè)節(jié)點(diǎn)了,是的話就next直接指向null了蟆沫。在刪頭結(jié)點(diǎn)時(shí)籽暇,因?yàn)榭赡苎h(huán)著遇到后面沒節(jié)點(diǎn)了的情況,比如 1 --> 1 這種全部要刪除的饭庞,所以在循環(huán)條件中利用 && 運(yùn)算符的特性戒悠,先判斷節(jié)點(diǎn)存在,然后再判斷值舟山,如果節(jié)點(diǎn)不存在绸狐,第一個(gè)判斷條件就無效,那么就不會處理第二個(gè)判斷條件累盗,否則直接判斷值有可能在無節(jié)點(diǎn)時(shí)報(bào)錯寒矿。
代碼(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