每天一道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不相等,那么直接继续往前移动。