链表
leetCode链表类型的题目
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]143. 重排链表
线性表链表不能直接对下标进行访问,所以可以将链表的节点全部存入线性表中,然后就可以通过下标直接访问链表节点然后重建链表class Solution { public void reorderList(ListNode head) { if (head == null) return; List<ListNode> list = new ArrayList<>(); ListNode node = head; .原创 2020-10-20 09:17:06 · 137 阅读 · 0 评论 -
[leetCode]86. 分隔链表
题目https://leetcode-cn.com/problems/partition-list/解法直观想法是使用两个哑节点,按顺序遍历输入的链表将小于x与大于x的节点分别添加在两个哑节点尾部,最后将两个哑节点所在的链表组合起来。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) {原创 2021-01-03 09:16:00 · 107 阅读 · 0 评论 -
[leetCode]148.排序链表
题目链接:https://leetcode-cn.com/problems/sort-list给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?归并排序 自顶向下可以将链表不断切分,直到分割成最小部分是有序的然后在利用有序链表的合并完成链表排序,要注意循环不变量是一个左闭右开的区间。class Solution { public ListNode sortList(Li原创 2020-11-21 11:38:28 · 108 阅读 · 0 评论 -
[leetCode]147. 对链表进行插入排序
题目链接:https://leetcode-cn.com/problems/insertion-sort-list对链表进行插入排序。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。使用哑节点创建一条新链表创建一个哑节点,使用pre指针指向需要插入位置的前一个节点,使用cur指针指向与当前插入节点比较的节点,使用p指原创 2020-11-20 10:19:14 · 65 阅读 · 0 评论 -
[leetCode]328. 奇偶链表
题目链接:https://leetcode-cn.com/problems/odd-even-linked-list给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。双指针思路: 使用一个odd指针指向链表中的奇数位置的节点,pre指针为odd的前一个节点。通过操作pre与odd指针来删原创 2020-11-13 09:03:47 · 88 阅读 · 0 评论 -
[LeetCode]2.两数相加
题目解法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode addT...原创 2019-11-20 09:33:15 · 80 阅读 · 0 评论 -
[leetCode].合并两个有序列表
解法一 暴力解法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = nex.原创 2020-06-19 12:49:04 · 302 阅读 · 0 评论 -
[leetCode]83.删除排序链表中的重复元素
解法一 双指针思路:跟删除排序数组相同元素想法一致,想到的是使用双指针,一个慢指针i,一个快指针j。首先i指向链表头部,j指向i的下一个元素如果j元素的值等于i元素的值则跳过重复元素j = j.next,否则不用跳过该元素每次内循环结束(跳过相同元素结束)使i.next = j;i=i.next,下一遍外循环又会使j指向i的下一个元素进入内循环进行比较。/** * Definition for singly-linked list. * public class ListNode { .原创 2020-07-02 11:03:21 · 131 阅读 · 0 评论 -
[leetCode]141.环形链表
哈希表遍历链表,将链表结点依次加入集合,如果集合中已经出现过该结点则说明是环形链表public class Solution { public boolean hasCycle(ListNode head) { HashSet set = new HashSet(); while(head!=null){ if(!set.contains(head)) set.add(head); else return true.原创 2020-07-17 09:34:25 · 94 阅读 · 0 评论 -
[leetCode]160.相交链表
暴力法每次从一个链表中取出一个结点,将该结点与另一个链表所有结点比对如果相等则返回当前结点。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class S原创 2020-07-19 10:07:23 · 164 阅读 · 0 评论 -
[leetCode]剑指 Offer 06. 从尾到头打印链表
栈要将链表从尾到头打印,即链表第一个最后打印,链表最后一个先打印,符合“后进先出”,因此可以使用栈结构。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public int[] reversePrint(Li.原创 2020-08-01 09:42:32 · 85 阅读 · 0 评论 -
[leetCode]删除排序链表中的重复元素 II
解法一 指针preNode指向当前指针的前一个节点;curNode指向当前节点;nextNode指向当前节点后的一个节点(不重复)。以curNode不为null为条件,向后遍历:判断curNode与nextNode指向的节点值是否相同- 不相同:按顺序往后移动这三个指针- 相同:说明有重复元素,向后移动nextNode指针直到跳过所有相同节点,然后删除相同的节点。/** * Definition for singly-linked list. * public class ListNode原创 2020-08-14 10:10:45 · 132 阅读 · 0 评论 -
[leetCode]剑指 Offer 18. 删除链表的节点
单指针 一这个解法和原著思路类似:找到要删除结点的位置p将p的下一个结点的值复制给p删除p的下一个结点由于没有处理尾部结点,最后需要判断:如果删除的是尾部结点,则找到尾部结点的前一个结点,再将尾部结点删除/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } .原创 2020-08-13 10:09:42 · 90 阅读 · 0 评论 -
[leetCode]剑指 Offer 25. 合并两个排序的链表
递归可以逐一比较两个链表的头节点,将交小的节点取出放到链表尾部。当链表1为空时返回链表2,当链表2为空时,返回链表1。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode merg.原创 2020-08-20 22:02:15 · 208 阅读 · 0 评论 -
[leetCode]剑指 Offer 24. 反转链表
解法翻转链表就需要操作链表中的指针,改变指针指向。如果要将当前节点指向前一个节点则需要记录当前节点和前一个结点。当改变指向后,当前节点与后一个节点发生断裂,因此需要记录后一个节点。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solu.原创 2020-08-20 20:28:44 · 107 阅读 · 0 评论 -
142. 环形链表 II
双指针首先可以使用快慢指针来判断该链表是否是环形链表,如果快指针能追上慢指针则是环形链表。假设环的节点数为n,用两个指针指向头节点,一个指针先向前移动n步,这时移动第二个指针,当第二个指针到达环的入口节点时,第一个指针恰好在环中走了一圈,这时就找到环的入口结点了。现在要解决的问题就是如何得到环的节点数:当快指针追上慢指针后返回它们相遇的节点,在此节点的基础上在环中遍历,使用计数器计数,当再次遇到该节点时计数结束,这样就得到了环的节点数。/** * Definition for singly.原创 2020-08-19 10:01:45 · 86 阅读 · 0 评论 -
[leetCode]剑指 Offer 22. 链表中倒数第k个节点
解法第一种思路是从前向后遍历到链表尾,再从尾部回溯k-1次。由于是单链表所以这种方法不能实现第二种思路是如果已知链表长度为n那么倒数k个节点为n-k+1个节点。链表长度需要遍历一遍链表才能知道,这种解法一共需要遍历两次有没有只遍历一次的解法呢?这时使用两个指针即可解决问题。使用一个指针A指向链表头部,向后移动k-1次。A指针移动K-1次后,使用指针B指向头节点,此时两个指针之间相差k-1步同时移动A、B指针,当A指针到达链表尾部时,B指针所指节点即为倒数第k个节点/** * De.原创 2020-08-18 12:01:56 · 109 阅读 · 0 评论 -
[leetCode]剑指 Offer 36. 二叉搜索树与双向链表
递归思路:将二叉搜索树中原先指向左节点的指针转化为双向链表中指向前一个结点的指针。将二叉搜索树中原先指向右节点的指针转化为双向链表中指向后一个节点的指针。要求转换后的双向链表是排序的所以可以使用中序遍历。当遍历到根节点时如下图所示,将树分为三部分:根节点10根节点为6的左子树根节点为14的右子树将10和左子树的最大节点8连接,与右子树的最小节点连接。由于需要先将左右子树转化为双向链表,然而这又是处理相同的问题所以可以使用递归/*// Definition for a N...原创 2020-08-30 15:39:56 · 139 阅读 · 0 评论 -
[leetCode]剑指 Offer 35. 复杂链表的复制
解法第一步:复制链表的所有节点,并放在对应节点之后形成一个长链表。这样的好处是在没有使用额外空间的情况下,在O(1)时间内找到random指针指向的节点第二步: 复制所有random指针第三步:将长链表的偶数部分与奇数部分拆分,返回偶数部分123/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { .原创 2020-08-29 14:36:55 · 91 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
递归 在一棵二叉树中寻找所有路径,每条路径节点值的和为目标值sum。假设根节点的值为val,由于二叉树的子树也是二叉树,问题可以转化为在左子树与右子树上寻找路径,该路径上的节点和为sum-val。所以可以使用二叉树的前序遍历的递归实现。 递归时添加路径上的节点,到达叶子节点时判断sum是否为0,如果为0则将这条路径保存。当递归返回父节点前删除路径上的当前节点。/** * Definition for a binary tree node. * public class TreeNode { *.原创 2020-08-28 12:41:51 · 149 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
递归 以上面这课二叉搜索树为例其后续遍历结果为[5,7,6,9,11,10,8]。可以知道数组的最后一个元数8是二叉树的根节点。二叉搜索树的左子树节点小于根节点,右子树大于根节点,所以数组[5,7,6,9,11,10,8]可以被分为两部分:[5,7,6]、[9,11,10]。这两部分又是一个二叉搜索树所以可以使用递归进行判断。 再来分析[7,4,6,5]这个序列,5为根节点由于7大于5所以这个二叉搜索树无左子树,所以其右子树[7,4,6]应大于5,二其中4小于5所以这个序列不是二叉搜索树的后续遍历。.原创 2020-08-27 09:14:37 · 100 阅读 · 0 评论 -
剑指 Offer 32 - I、II、III. 从上到下打印二叉树
题目一 不分行从上到下打印二叉树队列 BFS 使用广度优先可以遍历一幅有向图,树是图的一种特殊退化形式,从上到下按层遍历二叉树,从本质上来说就是广度优先遍历二叉树。 实现BFS可以使用一个队列,每次从队列中取出一个节点,将其子节点加入到队列中,知道队列为空。 由于题目要求输出一个数组,所以需要先知道树的节点数,因此可以使用递归先得到树的大小。 另一种方案是使用java提供的ArrayList, 最后将ArrayList的元素赋值给数组。/** * Definition for a binar.原创 2020-08-26 13:28:13 · 211 阅读 · 0 评论 -
[leetCode]剑指 Offer 52. 两个链表的第一个公共节点
解法一第一次遍历得到链表长度,找到较长的链表第二次遍历现在较长的链表上走几步,两个链表再同时遍历以同时达到尾节点。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */p.原创 2020-09-15 10:09:52 · 76 阅读 · 0 评论 -
[leetCode]剑指 Offer 62. 圆圈中最后剩下的数字
解法一 环形链表使用链表构造一个环,每个删除第m个数直到链表中剩下一个元素class Solution { public int lastRemaining(int n, int m) { if (n < 1 || m < 1) return -1; LinkedList<Integer> numbers = new LinkedList<>(); for (int i = 0; i &l原创 2020-09-26 10:58:26 · 809 阅读 · 0 评论 -
[leetCode]19. 删除链表的倒数第N个节点
双指针使用一个快指针与一个慢指针,快指针先移动n步,两个两个指针同时移动。当快指针到达最后一个节点后慢指针到达要删除节点的前一个节点,然后就可以将倒数第n个节点删除。如果快指针移动n步后为空,那么直接删除头节点class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null) return head; ListNode slow = head; .原创 2020-10-18 15:53:13 · 116 阅读 · 0 评论 -
[leetCode]34. 回文链表
快慢指针思路:1.将链表分为左右两部分2.将右半部分翻转3.使用两个指针判断是否是回文串/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public boolean isPalindrome(ListN.原创 2020-10-23 09:02:45 · 72 阅读 · 0 评论 -
[leetCode]面试题 02.07. 链表相交
双指针通过交换指针位置来使指针在循环过程中达到相同的位置public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) return null; ListNode pA = headA; ListNode pB = headB; whil.原创 2020-10-23 21:45:31 · 78 阅读 · 0 评论 -
[leetCode]206. 反转链表
双指针class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode cur = head; while (cur != null) { ListNode tempNext = cur.next; cur.next = prev; prev = cur;原创 2020-10-23 20:49:36 · 90 阅读 · 0 评论 -
[leetCode]707. 设计链表
原始链表操作无哑节点class MyLinkedList { class Node { int val; Node next; Node (int x) { val = x; } } private Node first = null; // 链表长度 private int N = 0; /** Initialize your data structure h.原创 2020-10-23 20:31:28 · 184 阅读 · 0 评论 -
[leetCode]203. 移除链表元素
哑节点删除链表的某个节点只需要操作该结点前一个节点的指针,假如删除的节点为头节点,那么就可以设置一个哑节点指向头节点,这样就统一了删除操作。class Solution { public ListNode removeElements(ListNode head, int val) { ListNode node = new ListNode(-1); node.next = head; ListNode prev = node; .原创 2020-10-23 19:05:11 · 70 阅读 · 0 评论