数据结构——链表的逆置

链表的逆置:

将一个链表进行逆置:

如: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指针指向。

注意遍历链表时跳出循环的条件。