資料結構與演算法-----單向線性連結串列(逆轉和反向列印)
阿新 • • 發佈:2018-12-24
單向連結串列沒有前指標,所以實現反向列印還是比較麻煩,我們這裡使用遞迴原理解決此問題。
這裡提到逆轉,也就是將單鏈表的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;
}