小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
1.移除链表元素 <难度系数⭐>
📝 题述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
💨 示例1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
💨 示例2:
输入:head = [ ], val = 1
输出:[ ]
💨 示例3:
输入:head = [7,7,7,7], val = 7
输出:[ ]
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
思路1,双指针,cur找到val值所在的节点,prev记录前一个位置,依次删除,细节请看下图:
思路2,新链表,把链表中所有不是val的值尾插至新链表,删除val的节点
1 | c复制代码#include<stdio.h> |
2.反转一个链表<难度系数⭐>
📝 题述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
💨 示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
💨 示例2:
输入:head = [1,2]
输出:[2,1]
💨 示例3:
输入:head = [ ]
输出:[ ]
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
思路1,调整节点指针的方向
思路2,头插
1 | c复制代码#include<stdio.h> |
3.链表的中间结点<难度系数⭐>
📝 题述:给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。
💨 示例1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 ([3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
快慢指针,快指针走2步,慢指针走1步,当快指针走完后,慢指针的当前位置就是中间节点
1 | c复制代码#include<stdio.h> |
4.链表中倒数第k个节点<难度系数⭐>
📝 题述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
💨 示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
快慢指针,快指针先走k步,此时它与慢指针相差的就是k步,然后快慢指针同时1步1步的走,直到快指针指向NULL,此时慢指针指向的节点就是目标节点
⚠ 这道题我在两个平台都做了下,按照常规的写法,发现它在leetcode能过的代码,在牛客网上却过不了
所以我们这里使用更严格的写法
1 | c复制代码#include<stdio.h> |
5.合并两个有序链表<难度系数⭐>
📝 题述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
💨 示例1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
💨 示例2:
输入:l1 = [], l2 = []
输出:[ ]
💨 示例3:
输入:l1 = [ ], l2 = [0]
输出:[0]
🧷 平台:Visual studio 2017 && windows
🔑 核心思想:
思路1,见下图
思路2,带哨兵位的头节点
在之前的文章中没有了解过什么是哨兵位头节点,在这里就了解下:
1️⃣ 哨兵位头节点,这个节点不存储有效数据;而非哨兵位头节点存储有效数据
2️⃣ 非哨兵位头节点如果要修改头指针,需要使用二级指针操作;而哨兵位头节点,则不会修改头指针,因为它不存储有效数据
3️⃣ 这种哨兵位头节点在实际中很少出现,包括哈希桶、临接表做子结构都是不带头的。其次就是OJ中给的链表都是不带头的(从上面做的这些题就可以看出),所以我们在以后编码过程中,应该尽量使用不带头的
1 | c复制代码#define _CRT_SECURE_NO_WARNINGS |
本文转载自: 掘金