算法:链表
面试常见链表算法题目
yc______
这个作者很懒,什么都没留下…
展开
-
leetcode-234:回文链表
题目描述请判断一个链表是否为回文链表。// 1 2 nil// 1 2 1 nil// 1 2 2 1 nil思路分析快慢指针找到链表中点从中点拆分并反转尾链表依次对比头尾链表值是否相等代码实现func isPalindrome(head *ListNode) bool { if head == nil { return true } fast := head.Next slow := head for fast != nil && fast.Next原创 2021-02-18 23:30:27 · 69 阅读 · 0 评论 -
leetcode-138:复制带随机指针的链表
题目描述给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。思路分析复制节点跟在原节点后边先复制链表,在复制随即指针,然后分割链表思路二:将随即指针存到map代码实现func copyRandomList(head *Node) *Node { if head == nil { return head } // 复制链表 cur := head for cur != nil { clone := &am原创 2021-02-18 00:46:07 · 158 阅读 · 0 评论 -
leetcode-142:环形链表II
题目描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。思路分析快慢指针,两指针相遇时,慢指针回到开头,快指针从下一个节点开始。两个指针一步一步走,相同时则为入环的第一个节点na + b = 2na + b代码实现func原创 2021-01-27 00:39:10 · 138 阅读 · 1 评论 -
leetcode-141:环形链表
题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。解题思路快慢指针,如果快指针和慢指针相遇则有环,遍历完链表没有相遇则无环对要操作的指针判断是否为空原创 2021-01-27 00:26:47 · 78 阅读 · 0 评论 -
leetcode-143:重排链表
题目描述给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.解题思路快慢指针找到中间节点,将链表分为两部分。原创 2021-01-05 00:08:33 · 135 阅读 · 0 评论 -
leetcode-148:排序链表
题目描述给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]示例 2:输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]示例 3:输入:head = []输出:[]解题思路归并排序快慢指针找链表中点进行拆分将拆分的链表继续进行拆分(递归),直到拆分为单个节点排序合并两个原创 2020-12-29 00:50:07 · 115 阅读 · 0 评论 -
leetcode-86:分隔链表
题目描述给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5解题思路对于头节点不确定的,用哑巴节点把大于x的存到另一个链表,然后将其接到原链表之后代码实现func partition(head *ListNode, x原创 2020-12-25 01:50:31 · 113 阅读 · 0 评论 -
leetcode-21:合并两个有序链表
题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路声明一个空的头节点比较两个链表,小的加入到新链表后边。该链表和新链表均向后移当一个链表为空时,判断两个链表,将不为空的剩余节点加入新链表后边代码实现/** * Definition for singly-linked list. * t原创 2020-12-24 01:19:07 · 89 阅读 · 0 评论 -
leetcode-92:反转链表ii
题目描述反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL解题思路保存头节点。扫描m之前的节点,保存第m个节点和第m-1个节点从第m个节点开始,到第n个节点进行反转。让第m-1个节点的next指向完成反转的链表(head为反转链表的头节点,第m个节点为反转链原创 2020-12-23 01:07:20 · 109 阅读 · 0 评论 -
leetcode-206:反转链表
题目描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解题思路循环处理,定义一个空的头节点记录已经反转的链表当前节点不为空,就将其下一个节点保存。将已经反转的链表接在该节点后边。将该节点赋值给记录已经反转的链表头指针将保存的下一个节点赋值给该节点,开始下一个代码实现/** * Definition for singly-linked list. *原创 2020-12-22 01:00:23 · 76 阅读 · 1 评论 -
leetcode-82:删除排序链表中重复的元素-ii
题目描述给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3解题思路创建一个空节点当头节点每次判断头节点的下一个和下下一个需要保存被删掉的值以循环判断,直到下一个不是此值每次对比的是下一个和下下一个。因此删除完不需要将当前指针移到下一个原创 2020-12-21 01:56:15 · 231 阅读 · 0 评论 -
leetcode-83:删除排序链表中的重复元素
题目描述给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3解题思路遍历链表,如果下一个节点与该节点值相同,将该节点的next指向下下个要注意判断下一个节点是否为空节点注意循环遍历当前节点,后边相同的删除干净再下一步代码实现/** * Definition for singly-linked list原创 2020-12-21 01:36:05 · 207 阅读 · 0 评论