反转链表:
递归版:
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的前面。