LeetCode:203. 移除链表元素

Posted Super algorithm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:203. 移除链表元素相关的知识,希望对你有一定的参考价值。

🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌱203. 移除链表元素

  • 题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

  • 来源:力扣(LeetCode)

  • 难度:简单

  • 提示:
    列表中的节点数目在范围[0, 104]
    1 <= Node.val <= 50
    0 <= val <= 50

  • 示例:
    输入:head = [1,2,6,3,4,5,6], val = 6
    输出:[1,2,3,4,5]

🌾关于链表:

如何构造链表-Node的表示

class listNode
    int val;
    listNode nextNode;
    public listNode() 
    
    public listNode(int val) 
        this.val = val;
    
    public listNode(int val, listNode nextNode) 
        this.val = val;
        this.nextNode = nextNode;
    

-链接

int[] nums = 1,2,6,3,4,5,6;
//构造链表
listNode head=new listNode(nums[0]);
listNode p=head;
for (int i = 1; i < nums.length; i++) 
    listNode q=new listNode(nums[i]);
    p.nextNode=q;
    p=q;

-打印链表

p=head;
while(p!=null) 
    System.out.print(p.val+" ");
    p=p.nextNode;

System.out.println();

🌴解题

删除一个链表节点只需要修改指针:把前一个元素的指针指向下一个元素。

1.常规链表删除

class Solution 
    publiclistNode removeElements(listNode head, int val) 
        if(head==null)//空链表提前返回
            return head;
        listNode p=head,q=head;

        while (p!=null)//遍历链表
            if(p.val==val)//找到目标元素
                if(p==q)//还是头结点
                    p=p.nextNode;
                    q=q.nextNode;
                    head=head.nextNode;
                else
                    q.nextNode=p.nextNode;
                    p=p.nextNode;
                
            else
                q=p;
                p=p.nextNode;
            
        
        return head;
    

2.递归删除

class Solution203 
    public static listNode removeElements(listNode head, int val) 
        if(head==null)
            return head;
        while(head.val==val) 
            head = head.nextNode;
            if(head==null)
                return head;
        
        head.nextNode=removeElements(head.nextNode,val);
        return head;
    


🌵Bug本是code常态,通过才是稀缺的意外!🌷

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

[JavaScript 刷题] 链表 - 移除链表元素, leetcode 203

[JavaScript 刷题] 链表 - 移除链表元素, leetcode 203

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:203. Remove Linked List Elements

题目

如下:

Given the head of a linked list and an integer val, remove all the nodes of the linked list that has Node.val == val, and return the new head.

解题思路

一般情况下会有这么几种可能性:

  1. 链表头部出现要去除的数字

    假设这里要去除的数字是 1,所有要移除的数字都在链表头部。

    1 2 1
  2. 链表中部出现要去除的数字

    假设这里要去除的数字是 2,所有要移除的数字都在链表中部。

    1 2 2

只要处理了这两个 special cases,那么剩下的就都不是问题了。

题目中需求说,依旧需要返回一个指向头部的结点,所以这道题也需要声名两个额外的结点指向头部,一个 head 用于遍历,一个 res 用于返回。

完了之后每次遍历 list1list2 时判断当前结点是否需要移除,如果是的话,跳到下一个;如果否,则更新遍历用的节点 head,让其指向当前结点,随后 head 指向 head.next

使用 JavaScript 解题

下面这个是比较平铺直叙地使用循环完成的解法,后面还有一种使用递归的解法。

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) 
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * 
 */
/**
 * @param ListNode head
 * @param number val
 * @return ListNode
 */
var removeElements = function (head, val) 
  let temp = head;

  while (temp && temp.val === val) 
    temp = temp.next;
  

  const res = temp;

  while (temp) 
    let next = temp.next;
    while (next && next.val === val) 
      next = next.next;
    

    temp.next = next;
    temp = temp.next;
  

  return res;
;

这个解法来自:3 line recursive solution

public ListNode removeElements(ListNode head, int val) 
        if (head == null) return null;
        head.next = removeElements(head.next, val);
        return head.val == val ? head.next : head;

同类型题

题目地址:83. Remove Duplicates from Sorted List

题目如下:

Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well.

代码如下:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) 
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * 
 */
/**
 * @param ListNode head
 * @return ListNode
 */
var deleteDuplicates = function (head) 
  if (head === null || head.next === null) return head;

  const res = head;

  while (head && head.next) 
    if (head.next.val === head.val) 
      head.next = head.next.next;
     else 
      head = head.next;
    
  

  return res;
;

以上是关于LeetCode:203. 移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-203-移除链表元素

LeetCode ( 203 ) ---[移除链表元素]

LeetCode Algorithm 203. 移除链表元素

LeetCode203. 移除链表元素

leetcode 203 移除链表元素

Leetcode 203. 移除链表元素