1. 程式人生 > >資料結構與演算法-----單向線性連結串列(逆轉和反向列印)

資料結構與演算法-----單向線性連結串列(逆轉和反向列印)

單向連結串列沒有前指標,所以實現反向列印還是比較麻煩,我們這裡使用遞迴原理解決此問題。
這裡提到逆轉,也就是將單鏈表的next指標指向前一個節點,我們也使用遞迴實現。

// 練習:實現單向線性連結串列的建立、測長、正向列印和
// 反向列印
// 逆轉
#include <iostream>
using namespace std;
class List {
public:
    // 建構函式中初始化為空連結串列
    List (void) : m_head (NULL), m_tail (NULL) {}
    // 解構函式中銷燬剩餘的節點
    ~List (void) {
        for
(Node* next; m_head; m_head = next) { next = m_head -> m_next; delete m_head; } } // 追加 void append (int data) { Node* node = new Node (data); if (m_tail) m_tail -> m_next = node; else m_head = node; m_tail = node; } // 測長
size_t length (void) const { size_t len = 0; for (Node* node = m_head; node; node = node -> m_next) len++; return len; } // 正向列印 void print (void) const { for (Node* node = m_head; node; node = node -> m_next) cout
<< node -> m_data << ' '; cout << endl; } // 反向列印 void rprint (void) const { rprint (m_head); cout << endl; } //逆轉 void reverse(void){ reverse(m_head); swap(m_head,m_tail); } private: // 節點 class Node { public: Node (int data = 0, Node* next = NULL) : m_data (data), m_next (next) {} int m_data; // 資料 Node* m_next; // 後指標 }; // 反向列印以head為首的子連結串列 void rprint (Node* head) const { if (head) {//使用遞迴(也即堆疊方式)實現逆向列印連結串列 rprint (head -> m_next); cout << head -> m_data << ' '; }//如果head為空,函式會一層一層的返回 } void reverse(Node *head){ if(head && head->m_next){ reverse(head->m_next); head->m_next->m_next=head; head->m_next=NULL; } } Node* m_head; // 頭指標 Node* m_tail; // 尾指標 }; int main (void) { List list; for (int i = 1; i <= 20; i++) list.append (i); cout << list.length () << endl; list.print (); list.rprint (); list.reverse (); list.print (); return 0; }