zoukankan      html  css  js  c++  java
  • 《数据结构与算法分析:C语言描述》复习——第三章“线性表、栈和队列”——双向链表

    2014.06.14 20:17

    简介:

      双向链表是LRU Cache中要用到的基本结构,每个链表节点左右分别指向上一个和下一个节点,能够自由地左右遍历。

    图示:

      

    实现:

      1 // My implementation for doubly linked list.
      2 struct ListNode {
      3     int val;
      4     ListNode *prev;
      5     ListNode *next;
      6     ListNode(int _val = 0): val(_val), next(nullptr), prev(nullptr) {};
      7 };
      8 
      9 class DoublyLinkedList {
     10 public:
     11     DoublyLinkedList() {
     12         m_size = 0;
     13         m_head = nullptr;
     14         m_tail = nullptr;
     15     }
     16     
     17     void insertFront(int val) {
     18         if (m_size == 0) {
     19             m_head = m_tail = new ListNode(val);
     20         } else {
     21             ListNode *ptr = new ListNode(val);
     22             ptr->next = m_head;
     23             m_head->prev = ptr;
     24             m_head = ptr;
     25         }
     26         ++m_size;
     27     }
     28     
     29     void insertBack(int val) {
     30         if (m_size == 0) {
     31             m_head = m_tail = new ListNode(val);
     32         } else {
     33             m_tail->next = new ListNode(val);
     34             m_tail->next->prev = m_tail;
     35             m_tail = m_tail->next;
     36         }
     37         ++m_size;
     38     }
     39     
     40     void insertNode(int pos, int val) {
     41         int i;
     42         
     43         if (i <= 0) {
     44             insertFront(val);
     45         } else if (i >= m_size) {
     46             insertBack(val);
     47         } else {
     48             ListNode *ptr1, *ptr2;
     49             
     50             ptr1 = m_head;
     51             for (i = 0; i < pos - 1; ++i) {
     52                 ptr1 = ptr1->next;
     53             }
     54             ptr2 = new ListNode(val);
     55             ptr2->next = ptr1->next;
     56             ptr1->next->prev = ptr2;
     57             ptr1->next = ptr2;
     58             ptr2->prev = ptr1;
     59             ++m_size;
     60         }
     61     }
     62     
     63     void deleteNode(int pos) {
     64         if (pos < 0 || pos > m_size - 1) {
     65             return;
     66         }
     67         
     68         ListNode *ptr1, *ptr2;
     69         if (pos == 0) {
     70             ptr1 = m_head;
     71             if (m_size == 1) {
     72                 m_head = m_tail = nullptr;
     73             } else {
     74                 m_head = m_head->next;
     75                 m_head->prev = nullptr;
     76             }
     77             delete ptr1;
     78         } else {
     79             ptr1 = m_head;
     80             for (int i = 0; i < pos - 1; ++i) {
     81                 ptr1 = ptr1->next;
     82             }
     83             ptr2 = ptr1->next;
     84             ptr1->next = ptr2->next;
     85             if (ptr2->next == nullptr) {
     86                 m_tail = ptr1;
     87             } else {
     88                 ptr2->next->prev = ptr1;
     89             }
     90             delete ptr2;
     91         }
     92         --m_size;
     93     }
     94     
     95     void updateNode(int pos, int val) {
     96         if (pos < 0 || pos > m_size - 1) {
     97             return;
     98         }
     99         
    100         ListNode *ptr = m_head;
    101         for (int i = 0; i < pos; ++i) {
    102             ptr = ptr->next;
    103         }
    104         ptr->val = val;
    105     }
    106     
    107     ListNode *findNode(int val) {
    108         ListNode *ptr = m_head;
    109         while (ptr != nullptr) {
    110             if (ptr->val == val) {
    111                 return ptr;
    112             }
    113             ptr = ptr->next;
    114         }
    115         
    116         return nullptr;
    117     }
    118     
    119     ~DoublyLinkedList() {
    120         ListNode *ptr = m_head;
    121         while (m_head != nullptr) {
    122             m_head = m_head->next;
    123             delete ptr;
    124             ptr = m_head;
    125         }
    126         m_head = m_tail = nullptr;
    127     }
    128 private:
    129     int m_size;
    130     ListNode *m_head;
    131     ListNode *m_tail;
    132 };
    133 
    134 int main()
    135 {
    136     return 0;
    137 }
  • 相关阅读:
    全面的学习资料(收藏)
    远程下载文件源码
    【转】c#托管资源和非托管资源区别
    Jquery 限制文本框输入字数
    好用的网站
    交叉表查询
    jquery 和 javascript 清空上传控件 方法总结
    关于java.io.IOException问题
    http 302
    django使用静态文件二
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3788686.html
Copyright © 2011-2022 走看看