將一個鏈表進行逆置:
如: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指針指向。
注意遍歷鏈表時跳出循環的條件。