数据结构整理(一) —— 链表的各种操作
2015-03-13 15:41
411 查看
马上要面临大规模的面试了,用了太久标准库,已经对数据结构的内部实现快忘了,趁着还有几天时间,自己又回忆了一下,用C++实现出来。所以接下来我在博客中会写一个“数据结构整理”系列,在面试之前,能回忆多少算多少吧,希望面试官能感受到我曾经是一个对数据结构很熟悉的人。。。
下面进入正题。
链表和数组都是线性表,数组就不多说了,说一下链表的实现。链表的名字很形象,就是一个一个的结点链在一起,必须找到一个结点的父节点,才能找到该结点,链表一般都有一个头结点,而且头结点一般不保存用户的数据,只是为了方便对链表的寻址。另外,可以在头结点中保存一些额外的信息,例如链表的长度,不过为了可读性,我个人不建议这样做。
下面是链表中一个结点的一般结构:
data字段保存结点中需要存储的信息,next指针保存下一个结点的地址。
一般在链表中都有一个头指针和一个尾指针,头指针始终指向头结点,作用是方便对链表寻址。尾指针指向链表最后一个结点,作用是减少插入数据时消耗的时间。对链表的操作一般有获取长度,插入结点,删除结点,排序,逆置等,所以链表的一般结构如下:
一个链表初始只有一个头结点,头指针和尾指针都指向头结点,链表长度为0。另外由于每个结点都是动态申请的堆内存,在析构函数中应及时释放,所以下面是构造函数和析构函数的实现:
单元测试
下面进入正题。
链表和数组都是线性表,数组就不多说了,说一下链表的实现。链表的名字很形象,就是一个一个的结点链在一起,必须找到一个结点的父节点,才能找到该结点,链表一般都有一个头结点,而且头结点一般不保存用户的数据,只是为了方便对链表的寻址。另外,可以在头结点中保存一些额外的信息,例如链表的长度,不过为了可读性,我个人不建议这样做。
下面是链表中一个结点的一般结构:
template <typename T> class Node { public: T data; Node *next; Node(T d) { data = d; next = nullptr; } Node() { next = nullptr; } };
data字段保存结点中需要存储的信息,next指针保存下一个结点的地址。
一般在链表中都有一个头指针和一个尾指针,头指针始终指向头结点,作用是方便对链表寻址。尾指针指向链表最后一个结点,作用是减少插入数据时消耗的时间。对链表的操作一般有获取长度,插入结点,删除结点,排序,逆置等,所以链表的一般结构如下:
template <typename T> class LinkList { private: Node<T>* head; Node<T>* rear; int lenth; public: LinkList(); ~LinkList(); inline int size(); void insert(T data); void remove(T data); void sort(); void reverse(); void getArray(T*& arr); };
一个链表初始只有一个头结点,头指针和尾指针都指向头结点,链表长度为0。另外由于每个结点都是动态申请的堆内存,在析构函数中应及时释放,所以下面是构造函数和析构函数的实现:
void test_linklist() { int number[] = {4, 2, 6, 7, 1, 4, 7}; LinkList<int>* list = new LinkList<int>(); for(int i = 0; i < 7; i++) { list->insert(number[i]); } int* arr = nullptr; list->getArray(arr); cout << "init:" << endl; for(int i = 0; i < list->size(); i++) { cout << arr[i] << endl; } delete arr; list->sort(); list->getArray(arr); cout << "after sort:" << endl; for(int i = 0; i < list->size(); i++) { cout << arr[i] << endl; } delete arr; list->reverse(); list->getArray(arr); cout << "after reverse:" << endl; for(int i = 0; i < list->size(); i++) { cout << arr[i] << endl; } delete arr; list->remove(4); list->getArray(arr); cout << "after remove 4:" << endl; for(int i = 0; i < list->size(); i++) { cout << arr[i] << endl; } delete arr; delete list; }
单元测试
相关文章推荐
- 线性链表 各种操作整理 数据结构
- C++数据结构之链表操作
- 数据结构与算法面试题汇编(1)- 链表的操作与应用
- 实战数据结构(5)_双向循环链表的基本操作
- 数据结构上机测试2-1:单链表操作A
- 手把手写数据结构之单向链表操作(一)
- 1138 数据结构上机测试2-1:单链表操作A
- (总结)数据结构之链表的基本操作说明和示例(待补充)
- 数据结构——几种链表基本操作
- 手把手写数据结构之单向循环链表操作
- 数据结构上机测试2-2:单链表操作B
- 数据结构:链表操作之反转链表
- 数据结构之单链表、双链表的基本操作
- 数据结构实验一--单链表的基本操作的算法
- 数据结构知识整理-链表的建立 逆置
- 数据结构之链表操作
- 数据结构顺序栈的各种操作
- 数据结构顺序队列的各种操作
- 寒假第二天--线性表--数据结构上机测试2-1:单链表操作A
- 数据结构之链表基本操作算法演示