链表基础

链表(Linked List)相比数组(Array),物理存储上非连续、不支持O(1)时间按索引存取;但链表也有其优点,灵活的内存管理、允许在链表任意位置上插入和删除节点。单向链表结构一般如下:

    //Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

相关LeetCode题:

707. Design Linked List  题解

链表增删改查

要完成链表节点的查找、插入、删除与修改,需要特别留意前后指针的修改、空指针的处理。总得来说链表增删改查分三步:1/定义结束条件(一般为到达链表尾) 2/遍历链表 3/遍历过程中完成增删改查。

一些情况下会用哑节点(dummy node)来更方便对链表增删改查,这有时可以减少代码量。比如 LeetCode题目 203. Remove Linked List Elements:

    // 203. Remove Linked List Elements
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy=new ListNode();
dummy->next=head;
ListNode* cur=dummy;
while(cur->next!=NULL){
if(cur->next->val==val) cur->next=cur->next->next;
else cur=cur->next;
}
return dummy->next;
}

以上如果不使用dummy node,如果head是要被删除的节点,则需要特殊判断和处理,使用dummy node则化解了这个问题。

相关LeetCode题:

203. Remove Linked List Elements  题解

876. Middle of the Linked List  题解

83. Remove Duplicates from Sorted List  题解

82. Remove Duplicates from Sorted List II  题解

328. Odd Even Linked List  题解

1019. Next Greater Node In Linked List  题解

1171. Remove Zero Sum Consecutive Nodes from Linked List  题解

也可以用递归的方式遍历链表,但这种方式会重复访问节点,时间复杂度比O(n)高很多。

相关LeetCode题:

24. Swap Nodes in Pairs  题解

反转/旋转链表

反转(reverse)链表与旋转(rotate)链表是考量链表操作的经典题目,最是考验做题人对链表节点逻辑关系的了解程度和是否能灵活处理指针。

相关LeetCode题:

206. Reverse Linked List  题解

92. Reverse Linked List II  题解

61. Rotate List  题解

25. Reverse Nodes in k-Group  题解

143. Reorder List  题解

环形链表

处理环形链表问题,常常用到双指针(Two Pointers)、快慢指针,例如 LeetCode题目 141. Linked List Cycle:

    // 141. Linked List Cycle
bool hasCycle(ListNode *head) {
if(head==NULL) return false;
ListNode* p=head;
ListNode* pp=head;
while(pp->next!=NULL&&pp->next->next!=NULL){
p=p->next;
pp=pp->next->next;
if(p==pp) return true;
}
return false;
}

相关LeetCode题:

141. Linked List Cycle  题解

142. Linked List Cycle II  题解

708. Insert into a Cyclic Sorted List  题解

多链表处理

多链表的增删改、合并,与单链表的处理方式一样,只是增加了对多个链表的遍历。

相关LeetCode题:

160. Intersection of Two Linked Lists  题解

21. Merge Two Sorted Lists  题解

2. Add Two Numbers  题解

445. Add Two Numbers II  题解

链表排序

对链表进行排序一般指原址排序,即修改节点指针指向、而不修改节点的值。对链表进行归并排序(Merge Sort),平均时间复杂度为O(nlogn),相比其他排序方法,归并排序在平均时间复杂度上是较优的方法。

相关LeetCode题:

147. Insertion Sort List  题解

148. Sort List  题解

 

算法与数据结构基础 - 链表(Linked List)的更多相关文章

  1. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  2. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  3. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  4. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  5. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  6. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  7. 算法与数据结构基础 - 二叉树(Binary Tree)

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  8. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  9. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

随机推荐

  1. 6tunnel数据转发

    6tunnel 一条命令实现端口映射.数据转发,实现代理服务器功能. 安装脚本 #!/bin/bash DIR=/opt/software INSTALL=6tunnel-master.tar.gz ...

  2. 使用Appium做手机自动化录制问题

    最近在使用appium做Android手机自动化脚本录制, 发现点击“tap”时,一直没有用,页面还是不能跳转. 咋办?发愁... 于是看到旁边有个“sendkeys”,那是不是能够直接发送参数不就行 ...

  3. 使用 Mybatis 框架 jdbc 方式批量写入 SQL Server,报错 com.microsoft.sqlserver.jdbc.SQLServerException 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数,最多应为2100

    这个错是sqlserver抛出来的. 进过验证,上述错误中的2100为插入的总字段数. 比如下面这种插入方式,values后面的一个括号里的字段为30个,那么后面最多只能加70条,即这种批量插入方式一 ...

  4. cocopods新建或者更新远端库主要操作步骤

    1.搭建远程仓库(私有或者公有项目): 2.使用sourceTree拉去远程仓库: 3.打开拉去的项目仓库Finder,构建pod lib项目:pod lib create AFNetworking( ...

  5. C++模版的用法

    模板是实现代码重用机制的一种工具,实质就是实现类型参数化,即把类型定义为参数. C++提供两种模板:函数模板,类模板 函数模板 template <typename T> T myMax( ...

  6. golang 单元测试&&性能测试

    一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必 ...

  7. C程序疑问解答 ——可怕的野指针

    本篇为原创,禁止任何形式的他用! 一.疑问点         指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程 ...

  8. 利用stub技术进行单元测试

    待测试类:WebClient: import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConne ...

  9. 使用java语言基于SMTP协议手写邮件客户端

    使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...

  10. 【CodeForces - 357B】Flag Day(水题)

    Flag Day Descriptions 小G请你对 n 个点进行染色,可选的颜色有三种:白.红.蓝,并使得给定的 m 个三元组中,每个点的颜色各不相同. 因为你可能不会三分图匹配,于是小G给出了更 ...