1.单链表
定义:别忘构造函数,struct与class无异。
// Definition for singly-linked list.
struct SinglyListNode {
int val;
SinglyListNode *next;
SinglyListNode(int x) : val(x), next(NULL) {}
};
时间复杂度:查找O(n),插入O(1),删除有O(n)和O(1)。
自写简单的链表实现:
其类实现参见:链接
#include "stdafx.h"
#include <iostream>
using namespace std;
// Definition for singly-linked list.
struct SinglyListNode {
int val;
SinglyListNode *next;
SinglyListNode(int x = 0, SinglyListNode * y = nullptr) : val(x), next(y) {}
};
void Display(SinglyListNode * root)//从头到尾打印链表
{
SinglyListNode * node = root;
while (node != nullptr)
{
cout << node->val << ' ';
node = node->next;
}
cout << endl;
}
void DeleteOne(SinglyListNode * root, int value)//删除指定值
{
SinglyListNode * node1 = root;
SinglyListNode * node2 = root;
while (node2->val != value)
{
node1 = node2;
node2 = node2->next;
}
node1->next = node2->next;
delete node2;
}
void AddAtTail(SinglyListNode * root, int value)//尾部添加
{
SinglyListNode * node = root;
while (node->next != nullptr)
{
node = node->next;
}
SinglyListNode *node1 = new SinglyListNode(value);
node->next = node1;
}
int main()
{
//SinglyListNode *node1 = &SinglyListNode(4);//也可,但是删除时要注意不能用delete
SinglyListNode *node1 = new SinglyListNode(4);
SinglyListNode *node2 = new SinglyListNode(5, node1);
SinglyListNode *node3 = new SinglyListNode(6, node2);
Display(node3);
DeleteOne(node3, 5);
Display(node3);
AddAtTail(node3, 10);
Display(node3);
system("pause");
return 0;
}
单链表相关操作:
判断链表是否有环及环的长度、反转链表、两个链表的第一个公共节点、倒数第K个节点等(剑指offer)。
2.双链表
定义:和二叉树的定义是一样的。
// Definition for doubly-linked list.
struct DoublyListNode {
int val;
DoublyListNode *next, *prev;
DoublyListNode(int x) : val(x), next(NULL), prev(NULL) {}
};
提供链表和其他数据结构(包括数组,队列和栈)之间时间复杂度
的比较: