用C++實現單鏈表的建立、逆置和輸出
阿新 • • 發佈:2019-02-05
題目描述:在已知單鏈表頭節點的情況下,設計演算法逆置單鏈表並輸出
方法一:採用首先將頭節點指向空,讓其變為尾節點,然後利用中間節點 p、q 將其後的節點一個接一個改為指向前面的節點
/****************************
*作者:劉峰
* 時間:2015\8\5
* 環境:VS2013
* 功能:實現建立一個節點可控的單鏈,並逆置輸出
****************************/
#include "stdafx.h" #include <iostream> using namespace std; struct List { int num; List *next; }; List *createList(int n) //建立含有n個節點的單鏈表 { List *head, *p, *q; q=head = NULL; //初始化表頭和中間指標 int i; for (i = n; i > 0; --i) { p = new List; //申請空間,建立第一個節點 cin >> p->num; //往節點中存入資料資訊 if (head == NULL) { head = p; } else { q->next = p; } q = p; } q->next = NULL; return head; } List *ReverseList(List *head) //逆置單鏈表 { List *p, *r; //定義兩個中間節點,用於順移逆置連結串列節點 if (head->next == NULL) return head; p = head; //獲取頭節點地址 r = p->next; //獲取連結串列第二個節點地址 p->next = NULL; //頭節點變為尾節點,原連結串列表頭指向空 while (r) { p = r; r = r->next; p ->next = head; //使第二個節點指向原先的頭節點 head = p; //使第二個節點變為頭節點,用於迴圈逆置 } return head; } void print(List *head) //輸出逆置後的單鏈表 { List *p; p = head; while (p) { cout<<p->num; p = p->next; cout << " "; } cout << endl; } int _tmain(int argc, _TCHAR* argv[]) { List *p, *q; cout << "請輸入單鏈表的節點個數:"; int n; cin >> n; cout << endl; cout << "建立一個節點為" << n << "的單鏈表" << endl; p = createList(n); cout << endl; cout << "這步為程式逆置單鏈表" << endl; q = ReverseList(p); cout << endl; cout << "列印逆置後的單鏈表" << endl; print(q); cout << endl; return 0; }
方法二:用p,q指向單鏈表中相鄰的兩節點,將r指向q的下一個結點,然後同步後移。當q=NULL時,表示指向原單鏈表的尾結點,將p賦值為頭節點 head 即可。
逆置函式程式碼如下(其他部分不變):
List *ReverseList(List *head)
{
List *p, *q, *r;
p = head;
if (p->next == NULL)
return head;
q = p->next;
while (q != NULL) //q為空,說明p為最後一個節點,所以結束while後將q賦值給head,作為逆置後的表頭
{
r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = NULL; //將原head變為逆置後連結串列的表尾
head = p; //逆置後新的表頭
return head;
}