链表基础

链表(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  题解

 

最新文章

  1. [MongoDB]Profiling性能分析
  2. poj 2763 Housewife Wind
  3. BADIP filter
  4. 【用户分析-用户场景】这TM才是产品思维!
  5. sqlite数据下载链接地址
  6. 关于Git的分支
  7. vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)
  8. 开发腾讯移动游戏平台SDK Android版Ane扩展 总结
  9. 设计模式 -- 解释器模式(Interpreter Pattern)
  10. 利用TinyXml进行数据库的热更新
  11. gradle入门(1-6)将Java项目从maven迁移到gradle
  12. Mybatis的SqlSession运行原理
  13. getModifiers 方法解释。
  14. Android四大组件之——ContentProvider(一)
  15. YARN结构分析与工作流程
  16. 平时收集的一些有关UED的团队和个人博客(转)
  17. Python排序算法之插入排序
  18. 【LeetCode】33. Search in Rotated Sorted Array (4 solutions)
  19. 使用vue来做局部刷新
  20. Eclipse创建javaWeb项目工程

热门文章

  1. HDU 3949:XOR(高斯消元+线性基)
  2. ZOJ 3963:Heap Partition(贪心+set+并查集)
  3. shiro自定义异常无法被捕获总是抛出AuthenticationException解决方案
  4. Java 技术交流群,微信群
  5. ~~Python文件简单操作~~
  6. 【DFS练习】【最大的蛋糕块】-C++
  7. 【题解】【A % B Problem(P1865)】-C++
  8. Jquery UI sortable
  9. 渐进式web应用开发---ajax本地数据存储(四)
  10. Ubuntu系统安装QQ等软件