链表
链表
爱抖腿的嘻嘻嘻
这个作者很懒,什么都没留下…
展开
-
有序链表转换二叉搜索树109
class Solution { public TreeNode sortedListToBST(ListNode head) { if(head==null)return null; return create(head,null); } public TreeNode create(ListNode left,ListNode right){ if (left == right) { return null原创 2021-04-03 23:08:04 · 79 阅读 · 0 评论 -
重排链表143
把链表排成l1 ln l2 ln-1的形式 需要把1,2,3,4,5,6 变成1,6,2,5,3,4相当于先找到链表中点,然后将后半段反转如果一开始为1,2,3,4,5,6则现在得到 1,2,3 和6,5,4 则进行归并即可。class Solution { public void reorderList(ListNode head) { if (head == null) { return; } ListNode原创 2021-04-03 22:01:03 · 74 阅读 · 0 评论 -
排序链表148
使用归并class Solution { public ListNode sortList(ListNode head) { if(head==null || head.next==null)return head; ListNode fast=head; ListNode slow=head; while(fast.next!=null && fast.next.next!=null){ fa原创 2021-04-03 21:50:46 · 64 阅读 · 0 评论 -
分割链表86
记得要最后把cur2的结尾清除为nullclass Solution { public ListNode partition(ListNode head, int x) { ListNode head1=new ListNode(); ListNode cur1=head1; ListNode head2=new ListNode(); ListNode cur2=head2; ListNode cur=head;原创 2021-04-03 21:16:47 · 85 阅读 · 0 评论 -
求链表长度
public class string{ public static void main(String[] argc){ ListNode n1=new ListNode(1); ListNode n2=new ListNode(2); ListNode n3=new ListNode(3); ListNode n4=new ListNode(4); ListNode n5=new ListNode(5);原创 2021-04-03 20:33:58 · 213 阅读 · 0 评论 -
k个一组翻转链表25
可以分析得到,如果递归的反转前k个,然后以k+1个节点为起点再次递归可以反转下k个,然后将这两个过程结合起来,如果不足的话需要保持原样。然后实现一个反转两个端点已知的链表,其实就是原来是cur到null停止,现在是到第二个端点停止。只不过最后一个点没连起来需要手动练一下。在区间a到b反转k个链表,for循环来判断此时的循环有没有k个元素,没有则直接返回。如果有的话反转a到b,这里都不用返回节点,因为a和b都是没变的,只不过换了个位置。但这里不需要反转b,反转的是一个左闭右开的区间。/** * Def原创 2021-04-03 17:17:42 · 81 阅读 · 0 评论 -
回文链表的判断234
利用快慢指针找到前半部分的尾结点,如果是奇数个节点的话会得到中间节点,所以将后半部分的节点进行反转。然后判断从尾结点开始的两部分是否相同,到最后时后半部分会为空,所以如果是奇数个也会把其忽略。最后将链表恢复。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int v原创 2021-02-19 10:34:21 · 62 阅读 · 0 评论 -
旋转链表61
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。这个题的k可能大于length,而且大于之后还要继续旋转,所以需要先遍历得到长度,然后再令k=k%length。利用快慢指针 就可以得到倒数第k个节点,完成指针的重定位。有特殊情况比如k=0的时候怎么做,可以根据情况来安排。class Solution { public ListNode rotateRight(ListNode head, int k) { if(head==null)retur原创 2021-01-15 14:41:43 · 62 阅读 · 0 评论 -
合并k个升序链表23
利用堆来维护链表的第一个值。import java.util.PriorityQueue;class Solution { public ListNode mergeKLists(ListNode[] lists) { if(lists==null || lists.length==0){ return null; } PriorityQueue<ListNode> pq=new PriorityQueue<原创 2021-01-10 22:53:55 · 68 阅读 · 0 评论 -
约瑟夫环
n个人围成圈,从0开始报数,一直报到m-1退出,剩下的人继续从0开始报数。求最后一个人在n个人中的编号,这就是一个约瑟夫问题。第一个出列的人定是m%n-1.然后剩下的人组成了一个新的约瑟夫环第一个人从m%n开始,剩下人又会组成一个新的约瑟夫环子问题...原创 2020-12-15 09:15:30 · 180 阅读 · 0 评论 -
翻转链表205 92
返回链表反转后的头结点这个题想想肯定是遍历,然后在遍历过程中将链表反转,反转之前要知道要反转的节点cur,它之前的节点pre,它之后的节点next,所以需要定义三个变量,然后循环。一定要注意先保存next的值,然后改变cur的指向(一次只改变一个cur的指针,不考虑next的),再迭代cur和pre,开始循环。直到最后cur是最后一个节点,然后将指针指向下一个,pre变成最后一个,cur变成next为null。所以最后返回pre即可。public class Solution { publi原创 2020-11-24 17:41:59 · 75 阅读 · 0 评论 -
复杂链表的复制138
复杂链表的赋值多拥有一个随机指针的链表的复制基本思路是先复制一遍普通的节点,第二遍遍历复制随机指针,但找到随机节点需要再遍历一遍链表,也就是复制每个节点都需要遍历一遍,则复杂度为O(n2)第二种思路是用空间换时间,来快速定位随机节点的位置,也就是用一个哈希表(或者是map)来存储这个节点对应的随机节点,这样复杂度就是O(1)第三种思路就是在不使用辅助空间的情况下完成O(n)的复杂度。第一遍遍历是创建新的节点之后将这个节点直接连到原节点后面第二遍遍历设置复制节点的随机指针,这个时候就非常好找节点,原创 2020-11-27 20:34:29 · 87 阅读 · 0 评论 -
两个链表的第一个公共节点52
输入两个链表,返回他们的公共节点(1)第一反应是遍历链表,每遍历第一个节点就遍历一次第二个链表,则长度为n和m时,复杂度为O(m*n)(2)然后分析他们的特点,发现如果是有公共节点的话,那整体就像一个Y字,则所有的公共节点都在尾部,而第一个公共节点就是公共节点的开头,我们需要倒序遍历,一直到第一个。那这就需要栈,准备两个栈一直遍历到结束,这时输出两个栈的元素直到不同的时候停止,此时的那个元素就是第一个公共节点。这样的空间复杂度和时间复杂度都是O(m+n)。(3)第三种思路是先遍历一次得到两个链表的长度原创 2020-12-08 20:04:02 · 83 阅读 · 0 评论 -
合并排序链表21
合并排序链表一看就类似于快排的合并过程,也是将两个数组合并,只不过这是两个链表。就比较两个头结点,然后决出哪个先哪个后,然后一个移动即可。最后要返回合成链表,所以要先选一个小的保存头结点,然后一直循环到清空一个队列,最后把另一个队列合并过去即可。第二种简洁的方法可以想到每次都循环合并剩下的链表,而且只需传入一个头结点即可,则可以用递归来实现。public class Solution { public ListNode Merge(ListNode list1,ListNode list2原创 2020-11-24 19:37:02 · 166 阅读 · 0 评论 -
求环的开始节点
求链表入口节点首先确定一个节点是否包含环,然后再找到环的入口。这个题思路很简单,第一步判断一个链表是否有环,只要两个指针,快慢指针,如果存在环,那快的指针一定会追上慢的指针,如果没有环,那快指针会走到头。怎么判断入口,第二步就是在快指针追上慢指针的时候,慢指针不动,快指针走一圈,当再次相遇走过的节点数就是环的长度,第三步然后从头开始,快指针先走n步,然后开始一起走,当相遇的时候,就是环的入口。但也可以不知道环的长度,直接求入口,方法就是第二步不求长度,而是令慢指针等于头结点,然后一起走,再次相遇就是原创 2020-11-22 15:17:39 · 98 阅读 · 0 评论 -
倒序输出链表
从尾到头打印链表输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路:如果要用辅助数组,那肯定是弄一个栈,然后遍历一遍链表,再输出一遍栈的元素。如果要简洁的实现肯定不用栈,可以想到利用递归,因为递归本身就是一个栈。import java.util.ArrayList;public class Solution { ArrayList<Integer> list=new ArrayList<Integer>(); public ArrayList原创 2020-10-30 09:59:46 · 213 阅读 · 0 评论 -
操作倒数第k个节点19
输出链表中倒数第k个节点,尾结点是第1个。这里就是要想到输入的问题,如果输入的k大于链表节点个数会发生什么。第一个思路就是先走到最后然后往回走k个节点,但没有向后的节点,所以不行。第二个想法是遍历一遍找到一共n个节点,然后输出第k-n-1个节点这样就要遍历两次。怎么实现遍历一遍就得到倒数第k个节点呢,那就设置两个指针,第一个指针走k-1步,第二个指针不动,这样他俩就差k-1个节点。然后他俩开始同时走,如果第一个节点走到最后,那第二个节点自然差的就是k个节点。需要处理的鲁棒性问题第一个是如果输入k原创 2020-11-22 14:40:34 · 125 阅读 · 0 评论 -
删除链表节点
1.O(1)删除链表节点如果按照正常做法就是遍历链表,然后找到要删除的节点,删除。但这样的复杂度一定是O(n)。其实不得到节点的前一个节点也可以删除节点,把后一个节点(此时可以直接得到后一个节点,因为此时要删除的节点是已经知道的)的内容复制到前一个节点,然后删除后一个节点也可以实现,这样只需得到后一个节点就可以实现删除。如果要删除的节点在尾部,没有下一个节点,那只能顺序遍历找到删除。如果链表中只有一个节点,则删除之后还要设置头结点为空。所以复杂度为(O(n)+(n-1)O(1))/n,结果仍为O(1)原创 2020-11-16 12:14:17 · 137 阅读 · 0 评论