數據結構——鏈表的逆置

鏈表的逆置:

將一個鏈表進行逆置:

如:10-->20-->30-->40        逆置後40-->30-->20-->10

分析:

方法一:

新建鏈表:遍歷舊鏈表,將舊鏈表的結點依此頭插到新鏈表中。

上代碼:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
	int data;
	struct Node* next;
}Node;

//創建結點
Node* BuyNode(int data) {
	Node* node = (Node*)malloc(sizeof(Node));
	node->data = data;
	node->next = NULL;
	return node;
}

//用創建新鏈表的方式來進行逆置
Node* reverse(Node* head) {
	Node* cur = head;
	Node* result = NULL;
	//創建一個新鏈表,將原來的鏈表中的結點頭插到新鏈表中
	//先進行判空
	if (cur == NULL) {
		return NULL;
	}
	while (cur != NULL) {
		Node* node = (Node*)malloc(sizeof(Node));
		node->data = cur->data;
		node->next = result;
		result = node;
		cur = cur->next;
	}
	return result;
}


void NodePrint(Node* head) {
	Node* cur = head;
	//先進行判空
	if (cur == NULL) {
		printf("鏈表爲空!!!\n");
		return;
	}
	while (cur != NULL) {
		printf("%d -->", cur->data);
		cur = cur->next;
	}
	return;
}


int main() {
	//創建結點
	Node* n1 = BuyNode(10);
	Node* n2 = BuyNode(20);
	Node* n3 = BuyNode(30);
	Node* n4 = BuyNode(40);
	//連接鏈表
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	NodePrint(n1);
	printf("\n\n逆置後的鏈表:\n\n");
	//進行逆置
	Node* result = reverse(n1);
	NodePrint(result);
	system("pause");
	return 0;
}

方法二:

在原鏈表上操作:這時需要三個遍歷指針,pre、cur、next。

cur:代表當前指針指向

pre:代表當前指針的的前一個結點的指向

next:代表下一個。

畫圖來表示一下:

上代碼:

//在原鏈表上進行操作
Node* reverse2(Node* head) {
	Node* cur = head;
	Node* pre = NULL;
	Node* next = cur->next;
	while (cur != NULL) {
		cur->next = pre;
		pre = cur;
		cur = next;
		if (next != NULL) {
			next = next->next;
		}
	}
	return pre;
}

總結:

逆置鏈表有兩種方式:

1.新建鏈表:遍歷原鏈表,將原鏈表的每個節點都頭插到新鏈表中。

2.在原鏈表上操作:利用三個遍歷指針來改變原鏈表中每個結點的next指針指向。

注意遍歷鏈表時跳出循環的條件。