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