1. 程式人生 > >用C++實現單鏈表的建立、逆置和輸出

用C++實現單鏈表的建立、逆置和輸出

題目描述:在已知單鏈表頭節點的情況下,設計演算法逆置單鏈表並輸出

方法一:採用首先將頭節點指向空,讓其變為尾節點,然後利用中間節點 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;
}