zoukankan      html  css  js  c++  java
  • 面试题3:自己实现单链表

      1 #include <cassert>
      2 #include <iostream>
      3 
      4 using namespace std;
      5 
      6 struct SingleListNode {
      7     int val;
      8     SingleListNode *next;
      9     SingleListNode(int x) :
     10             val(x), next(nullptr) {
     11     }
     12     SingleListNode(int x, SingleListNode* pn) {
     13         val = x;
     14         next = pn;
     15     }
     16 };
     17 
     18 class SingleList {
     19 private:
     20     SingleListNode *m_head;
     21     int m_length;
     22 public:
     23     SingleList() {
     24         m_head = nullptr;
     25         m_length = 0;
     26     }
     27     ~SingleList() {
     28         while (m_head) {
     29             SingleListNode *p = m_head->next;
     30             delete m_head;
     31             m_head = p;
     32         }
     33     }
     34     //插入
     35     void insert(int index, const int Ele) {
     36         assert(index > 0 && index < m_length + 2);
     37         if (index == 1) {
     38             m_head = new SingleListNode(Ele, m_head);
     39         } else {
     40             SingleListNode *p = m_head;
     41             while (index > 2) {
     42                 p = p->next;
     43                 index--;
     44             }
     45             p->next = new SingleListNode(Ele, p->next);
     46         }
     47         m_length++;
     48     }
     49 
     50     //删除操作:
     51     //-1:error 0:correct
     52     int erase(int index) {
     53         if (index < 1 || index > m_length) {
     54             return -1;
     55         }
     56         SingleListNode *p = m_head;
     57         if (index == 1) {
     58             m_head = m_head->next;
     59             delete p;
     60         } else {
     61             while (index > 2) {
     62                 index--;
     63                 p = p->next;
     64             }
     65             SingleListNode* tmp = p->next;
     66             p->next = p->next->next;
     67             delete tmp;
     68         }
     69         m_length--;
     70         return 0;
     71     }
     72     int getlength() {
     73         return m_length;
     74     }
     75 
     76     void print() {
     77         SingleListNode* p = m_head;
     78         while (p) {
     79             cout << p->val << "->";
     80             p = p->next;
     81         }
     82         cout << endl;
     83     }
     84 
     85     //插入排序
     86     void insertSort() {
     87         SingleListNode* fake = new SingleListNode(-1, m_head); //建一个假的节点
     88         if (m_head->next == nullptr) return;
     89         SingleListNode* cur = m_head->next;
     90         SingleListNode* cur_next = cur->next;
     91         SingleListNode* cur_pre = m_head;
     92         while (cur) {
     93             SingleListNode *p = fake;
     94             while (p->next != cur) {
     95                 if (cur->val < p->next->val) {
     96                     SingleListNode* tmp = p->next;
     97                     p->next = cur;
     98                     cur->next = tmp;
     99                     cur_pre->next = cur_next;
    100                     cur = cur_next;
    101                     if (cur)
    102                         cur_next = cur->next;
    103                     break;
    104                 } else {
    105                     p = p->next;
    106                 }
    107             }
    108             if (p->next == cur) {
    109                 cur_pre = cur;
    110                 cur = cur_next;
    111                 if (cur)
    112                     cur_next = cur->next;
    113             }
    114         }
    115         m_head = fake->next;
    116     }
    117 
    118     //归并排序
    119     void mergeSort() {
    120         m_head = mergeSort(m_head);
    121     }
    122 
    123     //链表翻转
    124     void reverse() {
    125         if (!m_head || !m_head->next)
    126             return;
    127         SingleListNode* cur = m_head->next;
    128         SingleListNode* cur_next;
    129         m_head->next = nullptr;
    130         while (cur) {
    131             cur_next = cur->next;
    132             cur->next = m_head;
    133             m_head = cur;
    134             cur = cur_next;
    135         }
    136     }
    137 private:
    138     SingleListNode* mergeSort(SingleListNode* head) {
    139         if (head == nullptr || head->next == nullptr)
    140             return head; //less 2 nodes
    141         SingleListNode* slow = head;
    142         SingleListNode* fast = head;
    143         SingleListNode* pre = head;
    144         while (fast && fast->next) {
    145             pre = slow;
    146             slow = slow->next;
    147             fast = fast->next->next;
    148         }
    149         pre->next = nullptr;
    150         cout << slow->val << endl;
    151         return merge(mergeSort(head), mergeSort(slow));
    152     }
    153 
    154     SingleListNode* merge(SingleListNode* l1, SingleListNode* l2) {
    155         SingleListNode* dummy = new SingleListNode(-1);
    156         SingleListNode* cur = dummy;
    157         while (l1 && l2) {
    158             if (l1->val < l2->val) {
    159                 cur->next = l1;
    160                 l1 = l1->next;
    161             } else {
    162                 cur->next = l2;
    163                 l2 = l2->next;
    164             }
    165             cur = cur->next;
    166         }
    167         if (l1)
    168             cur->next = l1;
    169         if (l2)
    170             cur->next = l2;
    171         return dummy->next;
    172     }
    173 
    174 };
    175 
    176 void insertSort(int a[], int n) {
    177     int temp;
    178     for (int i = 1; i < n; i++) {
    179         temp = a[i];
    180         int j = i - 1;
    181         while (j > -1 && temp < a[j]) {
    182             a[j + 1] = a[j];
    183             j--;
    184         }
    185         a[j + 1] = temp;
    186     }
    187 }
    188 
    189 int main() {
    190     SingleList l = SingleList();
    191     l.insert(1, 2);
    192     l.insert(1, 3);
    193     l.insert(1, 1);
    194     l.insert(2, 0);
    195     l.print();
    196     l.mergeSort();
    197 //    l.insertSort();
    198 //    l.mergeSort();
    199 //    l.reverse();
    200     l.print();
    201     return 0;
    202 }
  • 相关阅读:
    ES5新特性:理解 Array 中增强的 9 个 API
    ios
    Jquery异步 Deferred Object
    ES5中新增的Array方法详细说明
    Chart
    Angular常用语句
    vticker.js--垂直滚动插件
    <css系列>之css--float总结
    理解boot.img与静态分析Android/linux内核
    理解竞争条件( Race condition)漏洞
  • 原文地址:https://www.cnblogs.com/wxquare/p/6441202.html
Copyright © 2011-2022 走看看