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;
☕物有本末,事有终始,知所先后。🍭
🍎☝☝☝☝☝我的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 integerval
, remove all the nodes of the linked list that hasNode.val == val
, and return the new head.
解题思路
一般情况下会有这么几种可能性:
-
链表头部出现要去除的数字
假设这里要去除的数字是 1,所有要移除的数字都在链表头部。
-
链表中部出现要去除的数字
假设这里要去除的数字是 2,所有要移除的数字都在链表中部。
只要处理了这两个 special cases,那么剩下的就都不是问题了。
题目中需求说,依旧需要返回一个指向头部的结点,所以这道题也需要声名两个额外的结点指向头部,一个 head
用于遍历,一个 res
用于返回。
完了之后每次遍历 list1
和 list2
时判断当前结点是否需要移除,如果是的话,跳到下一个;如果否,则更新遍历用的节点 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. 移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章