链表
傅里叶不想变换_
这个作者很懒,什么都没留下…
展开
-
86.分隔链表
思路:维护两个链表 small 和 large, small存储小于x的结点,large存储大于等于x的结点。遍历完原链表后,我们只要将 small 尾节点指向 large 头节点即可。作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/partition-list/solution/fen-ge-lian-biao-by-leetcode-solution-7ade/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得.原创 2021-08-04 19:51:21 · 61 阅读 · 0 评论 -
24. 两两交换链表中的节点
思路:递归或者迭代迭代思路有两种,跟k个一组翻转链表有点像,即k = 2的时候25. K 个一组翻转链表class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode dum = new ListNode(0, head); int len = getLen(head); ListNode pre = dum, cur = head; .原创 2021-08-01 14:18:48 · 73 阅读 · 0 评论 -
328. 奇偶链表
思路:设置两个一个奇数链表头(其实就是head),一个偶数链表头(head.next),奇连偶,偶连奇。一直循环,最后奇偶相连class Solution { public ListNode oddEvenList(ListNode head) { if(head == null) return null; ListNode odd = head; ListNode even = head.next, evenHead = head.nex.原创 2021-07-14 15:25:10 · 70 阅读 · 0 评论 -
链表专题总结
链表专题从尾到头打印链表从尾到头打印链表import java.util.ArrayList;import java.util.ArrayDeque;public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayDeque<ListNode> stack= new ArrayDeque<>();原创 2021-03-15 16:23:59 · 282 阅读 · 0 评论 -
25. K 个一组翻转链表
翻转链表系列翻转链表K个一组翻转链表翻转链表 ListNode reverse(ListNode head){ if(head == null || head.next == null) return head; ListNode dum = new ListNode(0); ListNode pre = dum; ListNode cur = head; while(cur != null){ .原创 2021-04-11 16:21:59 · 100 阅读 · 0 评论 -
Leetcode141.环形链表
思路:1.HashSet 2.快慢指针public class Solution { public boolean hasCycle(ListNode head) { HashSet<ListNode> set = new HashSet<>(); while(head != null){ if(set.contains(head)){ return true; .原创 2021-03-15 15:31:07 · 55 阅读 · 0 评论 -
1721. 交换链表中的节点
只交换值:用 leftK 表示正数第 k 个节点,rightK 表示倒数第 k 个节点。初始化指向 head,leftK 前进 k-1 步就成了正数第 k 个节点,然后 temp 指向 leftK,让 rightK 和 temp 同时前进,直到 temp 到达最后一个节点,此时 rightK就成了倒数第 k 个节点,最后交换 leftK 和 rightK 的 val。class Solution { public ListNode swapNodes(ListNode head, int k).原创 2021-03-12 14:49:39 · 98 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
思路:二叉树的中序遍历是递增的,因此会想到中序遍历。class Solution { Node pre, head; public Node treeToDoublyList(Node root) { if(root == null) return null; inorder(root); head.left = pre; pre.right = head; return head; } ..原创 2021-01-21 14:38:56 · 72 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
思路: 1.构建 原链表节点 和 新链表对应节点 的键值对映射关系 2.复制拼接一份链表,然后再拆分成两个链表。class Solution { public Node copyRandomList(Node head) { if(head == null) return null; Node cur = head; Map<Node, Node> map = new HashMap<>(); //.原创 2021-01-17 10:57:30 · 1137 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
思路: 1.统计两个链表长度 lenA 和 lenB ,让长度长的链表先走 abs(lenB - lenA) 步,然后两个链表一起向前走,两个结点相等时退出循环。 2.A链表总长度为LA + C,B链表总长度为LB + C,A链表走完后指向B的头结点,再指向headB,走LB长度,此时A走过的总长度为 LA + C + LB,同理, B 走过的总长度为 LB + C +LA,此时就会相遇。注意点:尽量不要改变头结点head统计长度版本public class Solution { p.原创 2021-01-11 11:45:32 · 88 阅读 · 4 评论 -
剑指 Offer 24. 反转链表
定义两个指针: prev 和 curr, prev 在前 curr 在后。ListNode = null, ListNode curr = head; 每次让 curr 的 next 指向 prev ,实现一次局部反转curr.next = prev; 局部反转完成之后, prev 和 curr 同时往前移动一个位置prev = cur;cur = nextNode; 循环上述过程,直至 prev 到达链表尾部注意:要先移动prev再移动curr,即prev = cur;cur = ne.原创 2021-01-11 10:40:15 · 101 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的结点
思路: 1.双指针prev,cur,当 cur.val == val 时,执行 prev.next = curr.next 删除结点 2.递归函数public ListNode deleteNode(ListNode head, int val)表示删除链表中值等于val的结点 终止条件 1.当head等于空的时候,直接返回head,因为一个空的链表我们是没法删除的,if (head == null) return head; 2.如果head结点不等于空,并且head结点的值.原创 2021-01-11 10:19:51 · 82 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
思路: 1.栈是先进后出,可以不断压栈,最后依次弹出即可。注意for循环中不能用stack.size(),因为栈在弹出过程中size会变化。 2.递归 递推阶段: 每次传入 head.next ,以 head == null(即走过链表尾部节点)为递归终止条件,此时直接返回。 回溯阶段: 层层回溯时,将当前节点值加入列表,即tmp.add(head.val)。最终,将列表 tmp 转化为数组 res ,并返回即可。以链表1 -> 2 为例,画的递归示意图。public.原创 2021-01-11 09:36:28 · 47 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
思路: 1.先遍历一次获得链表长度n,然后从头开始走n - k步即可 2.快慢指针,先让快指针走k步,然后两个指针同时前进,当快指针遍历完链表时,返回 slow 即可。注意循环条件,如果是fast != null,应该走k步,如果是fast.next != null,应该走k - 1步。思路1class Solution { public ListNode getKthFromEnd(ListNode head, int k) { if(head == nul.原创 2021-01-11 00:57:36 · 67 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
思路:双指针,引入哨兵节点ListNode dum = new ListNode(0), cur = dum;,最后返回dum.next注意点:如果两个链表的长度不同,跳出循环后,有了l1 == null || l2 == null,将较长的链表挂在cur后面即可,也就是cur.next = l1 != null ? l1 : l2;/** * Definition for singly-linked list. * public class ListNode { * int val;.原创 2021-01-10 14:38:12 · 70 阅读 · 0 评论