每天一道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不相等,那麼直接繼續往前移動。