代码随想录算法训练营第三天| 203.移除链表元素 、 707.设计链表 ,206.反转链表

203.移除链表元素

分三步:
遍历找到数值相等的结点, 并且记录prev Node
直接将prev 的next 指针 跳到下一个 node
如果不相等,正常遍历即可

在找到数值相等的点,跳Node的时候,其实就等于向前进了2步,所以不用在最后再跳一次。

707.设计链表
单链表:
为了设计方便, 加一个head(dummy)Node 肯定可以省了不少的麻烦。
之后就是再get add delete 的时候要明白, get 是获得当前的node 的信息。
add 和 delete 要获得前一个Node的信息, 所以遍历的 截止点 是不一样的。
双链表:
adding 的时候,最主要的是保留住prev结点后面的节点信息(因为他只能用prev.next 找到),再对4个指针进行重新赋值。

206.Reverse Linked List
2刷之后,终于把迭代法秒写出来了!!!
如果你们疑惑的地方是不清楚到底先移动哪个指针, 那就继续往下看吧,因为我们都是同样的困境TT

只要同删除结点一样,记住前后步骤,当然要清楚为什么,这样秒写出来就不远了!

迭代法:
1:存住下一个结点的位置(因为指向他的指针需要变化)
1: 反转指针: (cur) 头指针的next 指针指向自己设置的 prev 指针 (初值为 null)
2:同时移动prev 和cur 点。 此时要注意先后顺序,以防把node覆盖
3:完成循环, 返回最后一个指针, 即 prev 指针(因为要遍历要最后一个node,最后一步的时候,prev 指针指向了最后一个点, cur 指向了Null)

递归:(自己也是一知半解,只能记下现在的想法,之后如果有更好的想法,会继续加到自己的笔记里)

我们可以想,完成所有链表反转的前一步是什么: 即后面都被反转,只剩下最后一个结点, 所以我们只需要考虑这2个点(或者说范围)之间是如何实现反转:
1->2->3->4->5
1 -> (2 <-- 3 <-- 4 <-- 5)

有3个点是需要考虑的:
1: 何时截止(也可以说需要考虑的corner case):到最后为空: head == null 并且之后会用到head.next 所以head.next也不能为空
2: 当前Node需要干什么:
他的next指针所指向的结点指向自己
他自己的Next 指针置0
3: 返回递归好的头节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值