反转链表+链表中间节点(leetcode简单)

206. 反转链表

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

思路1:翻转

1.用下面的图来讲(形象点,真实情况的话,箭头是不存在的),就是将每个箭头翻转,五个箭头一一反指即可,首先我们应当定义一个*n1为空指针,用来链接链表的最后最后一个元素的next,然后定义*n2作为链表的头部,此时可以这么想,将n2->next=n1,就是将图中元素1的next部分指向了空,然后需要将这个过程循环下去,这就完成了最基本的逻辑。

2.但是在操作的时候,我们将n2->next=n1完成第一步,我们发现找不到元素2了,因为此时元素1的next已经被修改指向NULL,所以我们还需要定义一个指针*n3来提前保存好下一步的地址,也就是n3=head->next,这样第一步执行之后,第二步开始循环之前,将n2的值赋给n1,将n3的值赋给n2,n3=n3->next,这就可以完成循环。

3.此时如果去执行的话,需要判断退出循环的逻辑条件,当n1指向4,n2指向5的时候,4和5的链接还没有执行,执行后,两者链接,n2置空,跳出循环,而此时也需要考虑n3的问题,如果n3变成了空指针,那么就不能执行n3=n3->next这句话,这是典型的对空指针解引用的错误。

 

 思路2:头插

1.首先我们可以定义一个新的空链表newhead置为NULL;然后需要定义*cur为头指向1,也就是head,这是题目中预先给好的。

2.头插的意思是将1这个元素链接到最开始的newhead,也就是NULL,然后将1作为新的newhead,来链接2,这时执行代码就是cur->next=newhead,如此循环完成翻转链表

3.这里和上面那个题一样,当你把1连接到NULL的时候,再回来找2,是找不到的,所以还需要定义一个指针nexter来维护2的地址,也就是next=cur->next,然后还需要将cur=nexter,此时的2就变成了cur,然后继续循环,退出的条件其实就是cur为空,这里还需要想一想,是否有可能在删除最后一个的时候,出现像上面n3的情况,这里其实是不会的。

876. 链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

思路:
这个题目使用快慢指针非常好做

定义两个指针同时指向head,一个叫slow一个叫fast,slow一次读一个,fast一次读两个,直到fast读到空(偶数个元素)或者fast->next读到空(奇数个元素)停止循环,此时slow正好就是中间元素。

这些都是单链表的leetcode题目,还会持续更新的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值