链表经典操作与实战

一、前言

算法是计算机软件的基础,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去。

二、链表定义与分类

链表是通过指针关联数据节点的一种存储结构。根据指针方向可以分为单向链表、双向链表以及环形链表。

  • 单向链表
  • 双向链表
  • 环形链表

三、链表的几类经典操作

  • 设置虚拟头节点

第一点,通过给链表设置虚拟头节点,可以保证头节点动作和其他非头节点操作逻辑一致。

比如下面例子,我们需要删除头节点1,我们只需要使用虚拟头节点指向头节点的next节点即可。

和假如我们需要删除第二个节点,那么会使用下面的方法,这个操作逻辑和上面逻辑一致。这就是使用虚拟头节点非常重要的一个好处。

第二点,通过设置虚拟头节点,我们处理完链表之后还能方便取到头节点。只需要使用dumy.next即可获取到头节点。

  • 双指针法遍历链表

双指针法遍历链表对反转链表非常有用。比如有两个指针遍历下面链表。

  • 定位前驱节点

这个操作是一个经验,我们需要对某个节点P执行删除或者修改时,我们先找他他的前驱节点,这样操作节点P更加方便。

上面找到了节点P的前驱节点Prev,使用节点Prev操作节点P会更加便利。

四、热点链表题目实战

leetCode206. 反转链表

这个题目就是双指针遍历链表的经典应用。一个前驱节点(用于当前节点反转指向的新节点),一个当前节点(需要反转的节点)

java 复制代码
/**
 * 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 = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {

        ListNode prev = null; //前驱节点
        ListNode curr = head; //当前节点

        while(curr != null) {

           ListNode temp = curr.next;
           //反转
           curr.next = prev;
           //当前节点变成前驱节点
           prev = curr;
           //当前节点指向下一个需要反转的节点
           curr = temp;
        }

        return prev;

    }
}
相关推荐
后青春期的诗go2 分钟前
基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(一)
开发语言·后端·rust
Tiny番茄2 分钟前
LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点
数据结构·算法·leetcode
信徒_1 小时前
SpringBoot 自动装配流程
java·spring boot·后端
景天科技苑1 小时前
【Rust闭包】rust语言闭包函数原理用法汇总与应用实战
开发语言·后端·rust·闭包·闭包函数·rust闭包·rust闭包用法
蓝婷儿2 小时前
前端面试每日三题 - Day 34
前端·面试·职场和发展
S01d13r6 小时前
LeetCode 解题思路 48(编辑距离、只出现一次的数字)
算法·leetcode·职场和发展
C_Liu_6 小时前
C语言:深入理解指针(5)
java·c语言·算法
small_wh1te_coder6 小时前
从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考
c语言·数据结构·c++·stm32·算法·leetcode·深度优先
枫景Maple6 小时前
LeetCode 45. 跳跃游戏 II(中等)
算法·leetcode
এ᭄画画的北北7 小时前
力扣-236.二叉树的最近公共祖先
算法·leetcode