移除链表元素
Posted zhiyue-bit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移除链表元素相关的知识,希望对你有一定的参考价值。
移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
Python
解一:
# Definition for singly-linked list.
#class ListNode(object):
#def __init__(self, val=0, next=None):
#self.val = val
#self.next = next
class Solution(object):
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
p = ListNode(next=head)
p = head
if head == None:
return head
while p.next != None:
if p.val == val:
head = p.next
p = p.next
elif p.next.val == val:
p.next = p.next.next
else:
p = p.next
if p.val == val:
p = p.next
head = p
return head
解二
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
sta = ListNode(next=head)
p = sta
while p.next != None:
if p.next.val == val:
p.next = p.next.next
else:
p = p.next
return sta.next
笔记
- python中不可变数据类型有:整型、浮点型、元组(改变变量值后,变量指向内存位置改变即为不可变类型);
- python中也是有指针的,python采用基于值的内存管理模式,每个变量都可以理解为指针(这也是为什么要用a = b[:]来创建一个不会影响原列表的列表副本),当指向不可变数据类型的变量改变值,会发生指向内存位置的改变;
- 解二中将后续移动的指针定义在head前面,即p.next = head,这样之后就不需要将链表首端和尾端为需要删除链点当作特殊情况。
203链表-移除链表元素
题目
思路
可以直接使用原来的链表来进行移除结点的操作。
需要区分删除头结点和删除非头结点
代码:
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr)
* ListNode(int x) : val(x), next(nullptr)
* ListNode(int x, ListNode *next) : val(x), next(next)
* ;
*/
class Solution
public:
ListNode* removeElements(ListNode* head, int val)
//删除头结点
while(head != NULL && head->val == val)
ListNode* temp = head;
head = head->next;
delete temp;
//删除非头结点
ListNode* cur = head;
while(cur != NULL && cur->next != NULL)
if(cur->next->val == val)
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
else
cur = cur->next;
return head;
;
也可以先设置一个虚拟头结点,再进行删除操作。
此时原链表的所有结点可以按照统一的方式移除。
代码:
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr)
* ListNode(int x) : val(x), next(nullptr)
* ListNode(int x, ListNode *next) : val(x), next(next)
* ;
*/
class Solution
public:
ListNode* removeElements(ListNode* head, int val)
ListNode* dummyHead = new ListNode(0);
//将虚拟头结点指向head,方便后面操作
dummyHead->next = head;
ListNode* cur = dummyHead;
while(cur->next != NULL)
if(cur->next->val == val)
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
else
cur = cur->next;
head = dummyHead->next;
delete dummyHead;
return head;
;
以上是关于移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript 刷题] 链表 - 移除链表元素, leetcode 203