链表的介绍(包括定义、直观理解、优势和示例)以及leetcode上一些链表相关算法题的思路。
目录
正文部分:
-
为什么要用链表,定义链表的基础是什么。
-
链表的直观理解
-
举例 (用链表而不是用数组来存储电影信息)
-
解析
-
继续优化代码
leetcode算法题-初级-链表
//删除某一节点
node->val = node->next->val;
node->next = node->next->next;
//删除节点
second->next=second->next->next;
ListNode *cur=head;
ListNode *pre=NULL;
while(cur){
ListNode *next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
- 合并两个有序链表
//应用递归
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//*** 特殊情况讨论省略 ***
if( l1->val < l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else{
l2->next = mergeTwoLists(l2->next, l1);
return l2;
}
}
- 回文链表
//快慢指针法找到中点,中点后反转链表
ListNode* fast = head;
ListNode* slow = head;
ListNode* prev = nullptr;
//find mid one
while(fast){
slow = slow->next;
fast = fast->next? fast->next->next: fast->next;//fast->next 为空的时候就没有fast->next->next了。
}
//reverse 操作和上文反转链表一致
//***省略
//依旧是快慢指针法,如果是环形链表,指针终将指到同一位置。
while (fast->next && fast->next->next) {
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
return true;
}
最后,补充阅读材料,本文不再赘述:一个非常全面的带有应用的总结 Linked List的复习总结-from:简书dol_re_mi
参考资料:c primer 17章 从数组到链表 || leetcode习题