马上要面临大规模的面试了,用了太久标准库,已经对数据结构的内部实现快忘了,趁着还有几天时间,自己又回忆了一下,用C++实现出来。所以接下来我在博客中会写一个“数据结构整理”系列,在面试之前,能回忆多少算多少吧,希望面试官能感受到我曾经是一个对数据结构很熟悉的人。。。

    下面进入正题。

    链表和数组都是线性表,数组就不多说了,说一下链表的实现。链表的名字很形象,就是一个一个的结点链在一起,必须找到一个结点的父节点,才能找到该结点,链表一般都有一个头结点,而且头结点一般不保存用户的数据,只是为了方便对链表的寻址。另外,可以在头结点中保存一些额外的信息,例如链表的长度,不过为了可读性,我个人不建议这样做。

    下面是链表中一个结点的一般结构:

 

template <typename T>
class Node {
public:
    T data;
    Node *next;
    Node(T d) {
        data = d;
        next = nullptr;
    }
    Node() {
        next = nullptr;
    }
};

 

    data字段保存结点中需要存储的信息,next指针保存下一个结点的地址。

    一般在链表中都有一个头指针和一个尾指针,头指针始终指向头结点,作用是方便对链表寻址。尾指针指向链表最后一个结点,作用是减少插入数据时消耗的时间。对链表的操作一般有获取长度,插入结点,删除结点,排序,逆置等,所以链表的一般结构如下:

 1 template <typename T>
 2 class LinkList {
 3 private:
 4     Node<T>* head;
 5     Node<T>* rear;
 6     int lenth;
 7 public:
 8     LinkList();
 9     ~LinkList();
10     inline int size();
11     void insert(T data);
12     void remove(T data);
13     void sort();
14     void reverse();
15     void getArray(T*& arr);
16 };

    一个链表初始只有一个头结点,头指针和尾指针都指向头结点,链表长度为0。另外由于每个结点都是动态申请的堆内存,在析构函数中应及时释放,所以下面是构造函数和析构函数的实现:

 1 template <typename T>
 2 LinkList<T>::LinkList() {
 3     head = new Node<T>();
 4     head->next = nullptr;
 5     rear = head;
 6     lenth = 0;
 7 }
 8 
 9 template <typename T>
10 LinkList<T>::~LinkList() {
11     Node<T>* cur = head->next;
12     while(cur != nullptr) {
13         delete head;
14         head = cur;
15         cur = cur->next;
16     }
17 }
构造函数和析构函数

相关文章:

  • 2021-09-11
  • 2022-12-23
  • 2022-01-04
  • 2021-12-25
  • 2018-05-16
  • 2021-12-26
  • 2021-07-06
  • 2021-08-01
猜你喜欢
  • 2021-07-21
  • 2022-12-23
  • 2021-07-28
  • 2020-04-28
  • 2021-09-05
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案