1. 程式人生 > >每天一道leetcode203-移除連結串列的元素

每天一道leetcode203-移除連結串列的元素

考試結束,班級平均分只拿到了年級第二,班主任於是問道:大家都知道世界第一高峰珠穆朗瑪峰,有人知道世界第二高峰是什麼嗎?正當班主任要繼續發話,只聽到角落默默想起來一個聲音:”喬戈裡峰

前言

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打卡群與技術交流群,歡迎關注。