链表

博客围绕链表展开,介绍了多种链表操作。包括递归和非递归方式反转链表,链表的合并、删除重复元素、找交点、判断是否为环形链表、排序,以及两两交换链表中的节点等操作,并给出了相应的实现思路和部分代码逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反转链表:
递归版:
head next == None : return head
1.new_head = reverselist(head.next)递归
2.head.next.next = head
3.head.next = None
return new_head
先让newhead通过递归找到最后的节点,并成为head的next节点,通过head next next控制newhead的next,让它指向head,最后断掉head next。
在这里插入图片描述

非递归版:
设置一个空的last开始 (用来找之前的节点)
1.temp = head.next(temp 代表下一个节点)
2.head.next = last (last第一次是空的所以正好把头next掷空)
3.last = head
4.head = temp
下一轮继续的时候
1.temp仍然会指向head next (head已经变成temp所以temp往下走)
2.head .next = last (last指向当前head前一个节点所以往前指)
3.last = head (last变成head)
4.head = temp(head往后走)
在这里插入图片描述

链表的合并:
在这里插入图片描述
在这里插入图片描述
我tm真是灵魂画师。
总之就是用一个res 或者node来记录最小的那个节点然后指向head1或者head2,再移动head1和head2。

删除重复元素:
这回写递归版本的
在这里插入图片描述
这无需画图了,十分简单,递归访问head next ,如果head next和head值相等那么head指向head的next就可以了。head = head next 相当于返回了下一个不相同值的节点给前面排好序的head的下一个节点。

找链表的交点:
设置两个链表的指针然后让他俩走,走到最后链接到另一个链表的头部继续走,如果他俩是有交点的那么总会遇到,如果没有的话就都返回null了。
在这里插入图片描述
判断一个链表是否为环形链表:
快指针一次跑两步,慢指针一次跑一步。这样如果是环形链表他们总会相遇,如果不是环形链表快指针总会跑到尽头。空间复杂度O(1)
在这里插入图片描述
排序链表:
利用归并排序对链表进行排序,考察1.归并排序 2.链表合并 3.找到中间节点的方法
1.归并排序的思路:注意因为要用到递归,所以一定要有head == None or head.next==None 然后返回head的判定,否则就出不来了。
在这里插入图片描述
2.链表合并的方法:上面已经有写了,就是用一个p next指向l1 l2中较小的那个节点然后p 指向那个节点,那条链表的head往后走一步。
3.找到中心节点:利用快慢指针,快的两步慢的一步,快的走完慢的正好走到中心。判断时候是fast next如果是空就不走了
代码分开来截取把:
排序:
在这里插入图片描述
合并:
在这里插入图片描述
在这里插入图片描述

两两交换链表中的节点:
设置pre指向当前节点前节点,cur为当前节点,next为cur往后跳两个两个节点(因为cur往后一个节点是会换成pre的)。
每次循环开始,next找到下一次交换的头位置,然后cur和pre进行交换,pre表示交换完成后在cur的前面。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值