【力扣刷题】203. 移除链表元素、剑指 Offer 18. 删除链表的节点

题目:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1:

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

示例2:

输入:head = [], val = 1
输出:[]

示例3:

输入:head = [7,7,7,7], val = 7
输出:[]

解法一:递归法

解题思路:

首先判断链表是否为空,为空就返回head(也就为空)。

然后通过递归保留head下一个指针位置,指向递归,(无论后面返回head还是head.next都会进入递归循环过程),head.next=self.removeElements(head.next,val)【当需要输出head.next时就会进入下一个元素过程判断,查看head.val是否等于val】,

后面只需要考虑head当前值是否等于val,如果等于就返回head.next,否则就返回head

代码又会因为需要输出head.next进入下一个元素进行递归中的循环。

解决方案(python)

#迭代法
if head==None:
    return head
#递,保留head下一个指针位置,(为了当后面判断完之后还能继续对下一个元素做判断)
head.next=self.removeElements(head.next,val)  
if head.val==val:
    #判断当前值是否符合条件,相等就不输出head当前值,转入head.next(由于上面递归,进入下一个元素)
    return head.next  
else:
    #不等于就输出当前head以及head.next等等后面的元素,而又因为上面递归,进入下一次递归过程
    return head

解法二:迭代法(这是我第一反应的解法,但是不够全面,逻辑不清晰,下面解释是捋清楚后的)

解题思路:

首先将头结点处不为空(不是空链表)且等于val的节点删除,因此不用判断句而是用while循环(可能不只一个相同值),相同的话就将head位置移动到下一个元素,直到该元素不等于val;

第二步是判断当前head的位置是不是为空(当然也会包括最初就为空链表的情况),为空就直接返回空(只写return一个词就表示返回空);

第三步将head的位置赋值给new,new=head。需要指正我自己的一个错误观点,这样的赋值只是将head此时位置赋值给new了,与后面任何元素都无关,并没有将整个后面的链表都赋予new,同时head也仅仅表示head当前位置,也不表示head拥有后面的元素

第四步就是让head位置保持不动,让new后移来删除相同元素节点,以此来改变链表。如果new指针指向的下一个元素与val相同,就将new.next=new.next.next,如果元素值不相同,就只需要直接将new的位置移动到下一个元素。

又需说明:当new往前移动删除某些节点后,head之后往后移动也就没有该元素了

最后,new删除后面相同节点后,返回head(head就从第一个不相同的元素的位置往后遍历)

#先将头节点前面相等的元素全部删除,
while (head is not None) and (head.val==val):
     head=head.next 
#当头结点为空或者删除相同头结点后为空时就直接返回空  
if not head:
    return 
new=head#将head此时的位置赋值给new,这样的赋值赋予new的仅仅是head当前位置,并不是后面所有链表
#对每一个元素进行判断,如果
while(new.next):
     if (new.next.val==val):   
         new.next=new.next.next#如果下一个元素值等于val,就将new的指针指向下一个的下一个元素
     else:
         new=new.next
return head

知识点:

知识1:链表中head仅仅表示head位置,不表示拥有后面的元素,因此,当new=head时,仅仅表示new也放在了head相同的位置,不代表拥有下一个元素。他们的指针往后指,也就遵循链表指针指向的位置。可以看做链表仅仅是一个链条结构,他们此时位于链条上的某个元素位置,当其中new往后移动,并改变指针方向后,head再往后移动就必须按照new改变后的链条方向移动。

 知识2:new=表示new换位置(不对链表改变);new.next=表示要改变new下一个位置(以及值),是会改变链表结构的。

new=new.next表示new的位置往后移动,并不说明删除new前面的元素

new.next=new.next.next表示对new下一指针方向赋值,也就会改变链表指针的方向;(该赋值表示会删除new当前位置的下一个指针指向的元素)

知识3:返回空,可以只写一个单词return

思考:

1、什么叫迭代法?

答:简单来说,就是让一步步往后移动元素

2、递归用法总结。

答:本题中用递归赋予给head.next,当后面需要返回head.next时,代码就是循环带入该函数,用出了循环的感觉。在赋值时并没有对递归运行代码,是在返回head.next时才将下一个元素带入函数的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值