“玩转链表”第一弹(算法 NO.3)

简介: 本文所列题目来自 LeetCode 中国网站,属于算法面试中关于链表的经典高频考题(“玩转链表”第一弹)。题解由 Doocs 开源社区 leetcode 项目维护者提供

本文所列题目来自 LeetCode 中国网站,属于算法面试中关于链表的经典高频考题(“玩转链表”第一弹)。题解由 Doocs 开源社区 leetcode 项目维护者提供。


目前已经有超过 50 位开发者参与了此项目,期待你的加入!


项目地址:https://github.com/doocs/leetcode


16.png


题目 1


题目描述


从尾到头打印链表


输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。


示例 1:


输入:head = [1,3,2]输出:[2,3,1]


限制:


0 <= 链表长度 <= 10000


解法


栈实现。


Python3


# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    def reversePrint(self, head: ListNode) -> List[int]:        res = []        while head:            res.append(head.val)            head = head.next        return res[::-1]


Java


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public int[] reversePrint(ListNode head) {        Stack<Integer> s = new Stack<>();        while (head != null) {            s.push(head.val);            head = head.next;        }        int[] res = new int[s.size()];        int i = 0;        while (!s.isEmpty()) {            res[i++] = s.pop();        }        return res;    }}


题目 2


题目描述


删除链表的节点


给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。


注意:此题对比原题有改动


示例 1:


输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.


示例 2:


输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.


说明:


题目保证链表中节点的值互不相同若使用 C 或 C++ 语言,你不需要 freedelete 被删除的节点


解法


定义一个虚拟头节点 dummy 指向 head,再定义指针 prep 分别指向 dummyhead


遍历链表,prep 往后移动。当指针 p 指向的节点的值等于 val 时,将 pre.next 指向 p.next,然后返回 dummy.next


Python3


# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    def deleteNode(self, head: ListNode, val: int) -> ListNode:        dummy = ListNode(0)        dummy.next = head        pre, p = dummy, head        while p:            if p.val == val:                pre.next = p.next                break            pre, p = p, p.next        return dummy.next


Java


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode deleteNode(ListNode head, int val) {        ListNode dummy = new ListNode(0);        dummy.next = head;        ListNode pre = dummy, p = head;        while (p != null) {            if (p.val == val) {                pre.next = p.next;                break;            }            pre = p;            p = p.next;        }        return dummy.next;    }}


题目 3


题目描述


链表中倒数第 k 个节点


输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾节点是倒数第 1 个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。


示例:


给定一个链表: 1->2->3->4->5, 和 k = 2.


返回链表 4->5.


解法


定义 pq 指针指向 head


p 先向前走 k 步,接着 pq 同时向前走,当 p 指向 null 时,q 指向的节点即为链表的倒数第 k 个节点。


Python3


# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:        if not (head or head.next):            return head        p = q = head        for _ in range(k):            p = p.next        while p:            p = p.next            q = q.next        return q


Java


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode getKthFromEnd(ListNode head, int k) {        if (head == null || head.next == null) {            return head;        }        ListNode p = head, q = head;        while (k-- > 0) {            p = p.next;        }        while (p != null) {            p = p.next;            q = q.next;        }        return q;    }}


题目 4


题目描述


反转链表


定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。


示例:


输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL


限制:


0 <= 节点个数 <= 5000


解法


定义指针 pq 分别指向头节点和下一个节点,pre 指向头节点的前一个节点。

遍历链表,改变指针 p 指向的节点的指向,将其指向 pre 指针指向的节点,即 p.next = pre。然后 pre 指针指向 ppq 指针往前走。


当遍历结束后,返回 pre 指针即可。


Python3


# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    def reverseList(self, head: ListNode) -> ListNode:        pre, p = None, head        while p:            q = p.next            p.next = pre            pre = p            p = q        return pre


Java


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {    public ListNode reverseList(ListNode head) {        ListNode pre = null;        ListNode p = head;        while (p != null) {            ListNode q = p.next;            p.next = pre;            pre = p;            p = q;        }        return pre;    }}


目录
相关文章
|
11月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
163 1
|
5月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
92 0
|
6月前
|
存储 监控 算法
员工电脑监控系统中的 C# 链表算法剖析-如何监控员工的电脑
当代企业管理体系中,员工电脑监控已成为一个具有重要研究价值与实践意义的关键议题。随着数字化办公模式的广泛普及,企业亟需确保员工对公司资源的合理利用,维护网络安全环境,并提升整体工作效率。有效的电脑监控手段对于企业实现这些目标具有不可忽视的作用,而这一过程离不开精妙的数据结构与算法作为技术支撑。本文旨在深入探究链表(Linked List)这一经典数据结构在员工电脑监控场景中的具体应用,并通过 C# 编程语言给出详尽的代码实现与解析。
96 5
|
11月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
115 0
|
11月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
122 0
|
11月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
108 0
|
11月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
257 0
|
7月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
177 30
|
7月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
260 25
|
7月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
100 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨

热门文章

最新文章