微博seo營(yíng)銷搜索引擎優(yōu)化的簡(jiǎn)稱
1、算法思路
講一下設(shè)置虛擬頭節(jié)點(diǎn)的那個(gè)方法,設(shè)置一個(gè)新節(jié)點(diǎn)指向原來鏈表的頭節(jié)點(diǎn),這樣我們就可以通過判斷鏈表的當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)值是不是目標(biāo)刪除值,來判斷是否刪除這個(gè)后繼節(jié)點(diǎn)了。如果不設(shè)置虛擬頭節(jié)點(diǎn),則需要將頭節(jié)點(diǎn)和后面的節(jié)點(diǎn)分開來討論,代碼會(huì)復(fù)雜一點(diǎn)。
2、Java代碼實(shí)現(xiàn)
package listnodes;//Definition for singly-linked list.
class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}public class RemoveElements {public static void main(String[] args) {//構(gòu)造鏈表
// int[] nums = new int[]{1,2,6,3,4,5,6};
// int[] nums = new int[]{7,7,7,7};int[] nums = new int[]{1,2,2,1};ListNode head = null;for (int i = nums.length - 1; i >= 0; i--) {ListNode node = new ListNode(nums[i]);if(head != null){node.next = head;}head = node;}//處理鏈表Solution sol = new Solution();
// ListNode resNode = sol.removeElements(head, 6);//[1,2,3,4,5]
// ListNode resNode = sol.removeElements(head, 7);//[]ListNode resNode = sol.removeElements(head, 2);//[1, 1]//遍歷鏈表并打印StringBuilder sb = new StringBuilder("[");while(resNode != null){if(sb.length() != 1) sb.append(", ");sb.append(resNode.val);resNode = resNode.next;}sb.append("]");System.out.println(sb);}
}// 遞歸法
//class Solution {
// public ListNode removeElements(ListNode head, int val) {
// if (head == null) {
// return head;
// }
// head.next = removeElements(head.next, val);
// return head.val == val ? head.next : head;
// }
//}// 頭結(jié)點(diǎn)是否刪除最后再考慮
//class Solution {
// public ListNode removeElements(ListNode head, int val) {
// ListNode pre = head;
// while(pre != null && pre.next != null){
// if(pre.next.val == val){
// //跳過當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)賦值給當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的next,相當(dāng)于刪除當(dāng)前節(jié)點(diǎn)
// pre.next = pre.next.next;
// }else{
// pre = pre.next;
// }
// }
// pre = head;
// while(pre != null && pre.val == val){
// pre = pre.next;
// }
// return pre;
// }
//}// 設(shè)置一個(gè)虛擬頭結(jié)點(diǎn),這樣代碼更簡(jiǎn)單
class Solution {public ListNode removeElements(ListNode head, int val) {ListNode temp = new ListNode(0);temp.next = head;ListNode pre = temp;while(pre.next != null){if(pre.next.val == val){//跳過當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)賦值給當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的next,相當(dāng)于刪除當(dāng)前節(jié)點(diǎn)pre.next = pre.next.next;}else{pre = pre.next;}}return temp.next;}
}
3、完整題目
203. 移除鏈表元素
給你一個(gè)鏈表的頭節(jié)點(diǎn)?head
?和一個(gè)整數(shù)?val
?,請(qǐng)你刪除鏈表中所有滿足?Node.val == val
?的節(jié)點(diǎn),并返回?新的頭節(jié)點(diǎn)?。
示例 1:
輸入:head = [1,2,6,3,4,5,6], val = 6 輸出:[1,2,3,4,5]
示例 2:
輸入:head = [], val = 1 輸出:[]
示例 3:
輸入:head = [7,7,7,7], val = 7 輸出:[]
提示:
- 列表中的節(jié)點(diǎn)數(shù)目在范圍?
[0, 10^4]
?內(nèi) 1 <= Node.val <= 50
0 <= val <= 50