每天一道leetcode203-移除鏈表的元素

  • 2019 年 10 月 4 日
  • 筆記

題目

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相等的節點,採取之前的這道題的解法每天一道leetcode237-刪除鏈表中的節點,就是交換當前節點與下一個節點的val值,然後把下一個節點刪除就行;
  • 最後處理最後的一個節點。

代碼

/**   * Definition for singly-linked list.   * public class ListNode {   *     int val;   *     ListNode next;   *     ListNode(int x) { val = x; }   * }   */  class Solution {      public ListNode removeElements(ListNode head, int val) {          if(head == null)              return head;          while(head != null && head.val == val)              head = head.next;          if(head == null)              return head;          ListNode temp = head.next;          ListNode pre = head;          while(temp != null)          {              if(temp.next == null)              {                  if(temp.val != val)                      break;                  pre.next = null;                  break;              }              if(temp != null && temp.val == val)              {                  int value = temp.next.val;                  temp.val = value;                  temp.next = temp.next.next;              }else              {                  pre = temp;                  temp = temp.next;              }            }          return head;      }  }  

代碼講解

  • 13-14行去判斷開頭的節點,如果頭結點與val值相等,那麼該刪除,直到頭結點值不相等
  • 17-18行是保留一個pre的前置節點,以便刪除最後一個節點(如果與val相等)
  • 21-27行是處理最後一個節點,如果最後一個節點是val,那麼刪除最後一個節點,pre的下一個就是最後一個節點;
  • 28-32行如果中間的當前節點與val值相等,那麼通過交換當前節點的值與下一個節點的值以後,刪除一個節點的;
  • 35-36行如果與val不相等,那麼直接繼續往前移動。