每天一道leetcode203-移除連結串列的元素
阿新 • • 發佈:2018-11-07
考試結束,班級平均分只拿到了年級第二,班主任於是問道:大家都知道世界第一高峰珠穆朗瑪峰,有人知道世界第二高峰是什麼嗎?正當班主任要繼續發話,只聽到角落默默想起來一個聲音:”喬戈裡峰”
前言
2018.11.7號打卡
明天的題目leetcode141-環形連結串列:
https://leetcode-cn.com/problems/linked-list-cycle/
題目
leetcode203-移除連結串列的元素
中文連結串列:
https://leetcode-cn.com/problems/remove-linked-list-elements/description/
英文連結:
https://leetcode.com/problems/remove-linked-list-elements/description/
分類:連結串列:
題目詳述
刪除連結串列中等於給定值 val 的所有節點。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
題目詳解
思路
- 首先是刪除開頭的節點與val值相等的節點;
- 然後是刪除中間的與val相等的節點,採取之前的這道題的解法,就是交換當前節點與下一個節點的val值,然後把下一個節點刪除就行;
- 最後處理最後的一個節點。
程式碼
1/**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode(int x) { val = x; }
7 * }
8 */
9class Solution {
10 public ListNode removeElements(ListNode head, int val) {
11 if(head == null)
12 return head;
13 while(head != null && head.val == val)
14 head = head.next;
15 if(head == null)
16 return head;
17 ListNode temp = head.next;
18 ListNode pre = head;
19 while(temp != null)
20 {
21 if(temp.next == null)
22 {
23 if(temp.val != val)
24 break;
25 pre.next = null;
26 break;
27 }
28 if(temp != null && temp.val == val)
29 {
30 int value = temp.next.val;
31 temp.val = value;
32 temp.next = temp.next.next;
33 }else
34 {
35 pre = temp;
36 temp = temp.next;
37 }
38
39 }
40 return head;
41 }
42}
程式碼講解
- 13-14行去判斷開頭的節點,如果頭結點與val值相等,那麼該刪除,直到頭結點值不相等
- 17-18行是保留一個pre的前置節點,以便刪除最後一個節點(如果與val相等)
- 21-27行是處理最後一個節點,如果最後一個節點是val,那麼刪除最後一個節點,pre的下一個就是最後一個節點;
- 28-32行如果中間的當前節點與val值相等,那麼通過交換當前節點的值與下一個節點的值以後,刪除一個節點的;
- 35-36行如果與val不相等,那麼直接繼續往前移動。
結束語
2018.11。7打卡
作者喬戈裡親歷2019秋招,哈工大計算機本碩,百度准入職java工程師,歡迎大家關注我的微信公眾號:程式設計師喬戈裡,公眾號有3T程式設計資源,以及我和我朋友(准入職百度C++工程師)在秋招期間整理的近200M的面試必考的java與C++面經,並有每天一道leetcode打卡群與技術交流群,歡迎關注。