鏈表的反轉


在這裏插入圖片描述

1.單鏈表的反轉

#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LNode* LinkList;
typedef struct LNode{
	ElemType data;
	LinkList next;
}LNode;
//初始化
void InitList(LinkList &L){
	L = new LNode;
	L->next = NULL;
	return;
}
//插入
void InsertList(LinkList &L, ElemType e){
	if (!L){
		InitList(L);
		L->data = e;
		return;
	}
	else{
		InsertList(L->next, e);
	}
}
//反轉
void ReverseList(LinkList &L){
	LinkList q = NULL, p;//p是當前節點;q是p的前驅
	while (L){
		p = L;
		L = L->next;
		p->next = q;
		q = p;
	}
	L = p;//這樣p永遠是表頭
	return;
}
//輸出
void OutputList(LinkList L){
	if (!L){ printf("空\n"); return; }
	while (L){
		printf("%d ", L->data);
		L = L->next;
	}
	printf("\n");
	return;
}
int main(){
	LinkList L = NULL;
	int n;
	ElemType t;
	scanf("%d", &n);
	while (n--){
		scanf("%d", &t);
		InsertList(L, t);
	}
	OutputList(L);
	ReverseList(L);
	OutputList(L);
	return 0;
}

1.0結構體

typedef int ElemType;
typedef struct LNode* LinkList;
typedef struct LNode{
	ElemType data;
	LinkList next;
}LNode;

1.1初始化

void InitList(LinkList &L){
	L = new LNode;
	L->next = NULL;
	return;
}

1.2插入

void InsertList(LinkList &L, ElemType e){
	if (!L){
		InitList(L);
		L->data = e;
		return;
	}
	else{
		InsertList(L->next, e);
	}
}

1.3反轉

void ReverseList(LinkList &L){
	LinkList q = NULL, p;//p是當前節點;q是p的前驅
	while (L){
		p = L;
		L = L->next;
		p->next = q;
		q = p;
	}
	L = p;//這樣p永遠是表頭
	return;
}

1.4輸出

void OutputList(LinkList L){
	if (!L){ printf("空\n"); return; }
	while (L){
		printf("%d ", L->data);
		L = L->next;
	}
	printf("\n");
	return;
}

2.雙向鏈表

#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LNode *LinkList;
typedef struct LNode{
	ElemType data;
	LinkList next, previous;
}LNode;
//初始化
void InitList(LinkList &L){
	L = new LNode;
	L->previous = NULL;
	L->next = NULL;
	return;
}
//插入
void InsertList(LinkList &L, ElemType e){
	if (!L){
		InitList(L);
		L->data = e;
	}
	else{
		InsertList(L->next, e);
		L->next->previous = L;
	}
}
//翻轉
void ReverseList(LinkList &L){
	if (!L){return; }
	LinkList p, q = NULL, t;//p代表當前點,q是p的前驅,t是p的後導
	while (L){
		p = L;
		L = L->next;
		t = L;
		p->previous = t;
		p->next = q;
		q = p;
	}
	L = p;//L已經是NULL,p是一開始的尾節點,現在是頭結點
	return;
}
//輸出
void OutputList(LinkList L){
	if (!L){ printf("空\n"); return; }
	while (L){
		printf("%d ", L->data);
		L = L->next;
	}
	printf("\n");
	return;
}
int main(){
	int n;
	printf("表長:");
	scanf("%d", &n);
	LinkList L=NULL, f = NULL;
	ElemType e;
	while (n--&&n>=0){
		scanf("%d", &e);
		InsertList(L, e);
	}
	OutputList(L);
	ReverseList(L);
	printf("翻轉:");
	OutputList(L);
	system("pause");
	return 0;
}

2.0結構體

typedef int ElemType;
typedef struct LNode *LinkList;
typedef struct LNode{
	ElemType data;
	LinkList next, previous;
}LNode;

2.1初始化

void InitList(LinkList &L){
	L = new LNode;
	L->previous = NULL;
	L->next = NULL;
	return;
}

2.2插入

利用了初始化,遇空樹則初始化
注意遞歸返回上一層函數時,要掛接L->next的前驅,因爲在初始化並賦值L->next的過程中,它的previous是指向NULL而不是L的

void InsertList(LinkList &L, ElemType e){
	if (!L){
		InitList(L);
		L->data = e;
	}
	else{
		InsertList(L->next, e);
		L->next->previous = L;
	}
}

2.3反轉

void ReverseList(LinkList &L){
	if (!L){return; }
	LinkList p, q = NULL, t;//p代表當前點,q是p的前驅,t是p的後導
	while (L){
		p = L;
		L = L->next;
		t = L;
		p->previous = t;
		p->next = q;
		q = p;
	}
	L = p;//L已經是NULL,p是一開始的尾節點,現在是頭結點
	return;
}

2.4輸出

void OutputList(LinkList L){
	if (!L){ printf("空\n"); return; }
	while (L){
		printf("%d ", L->data);
		L = L->next;
	}
	printf("\n");
	return;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章