單鏈表的逆轉是一個基礎的數據結構題,做起來不難。和解決這個問題一起寫的還有做題的規矩,不能因一個問題簡單就直接開始寫代碼,對於初學者來說,寫代碼前先寫一個程序的大致框架是很有用的。
解題思路:
創建一個單鏈表,遍歷這個鏈表並且以頭插法將這個鏈表賦值給另一個鏈表。
另外,我也得寫下我這個菜鳥遇到的問題和解決辦法,不管遇到的問題有多基礎,有問題就得解決並且記錄,這是一個菜鳥的尊嚴。
問題:
首先,我所理解的鏈表就是,有頭指針,鏈表的最後一個元素的後繼是空(NULL),這才能稱之爲鏈表。
我遇到的算法上的問題就是,如何將一個鏈表上的值賦給另一個鏈表(傻瓜問題,但是有問題就得記錄),剛開始我是直接將鏈表賦值的(傻瓜操作,得改),知道錯了就改變方法。
鏈表上的每一個元素都有數據域和指針域,每次賦值的時候得開闢一個鏈表元素類型(即結構體指針類型)的內存空間,然後將數據賦值給開闢好的內存空間的數據域,再將這個內存空間(即一個在磁盤上擁有自己的空間的結構體指針)以頭插法連到新的鏈表上,新的鏈表剛開始當然是一個空鏈表,但是作爲一個鏈表,必須要有一個鏈表該有的東西,即頭指針,而且其後繼要爲NULL,這是原則問題。
代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//定義結構體
typedef struct Node
{
int data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
//頭插法創建鏈表
void CreateListHead(LinkList *L,int n)
{
LinkList p;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for(i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;
p->next = (*L)->next;
(*L)->next=p;
}
}
//單鏈表的逆轉
LinkList reverse(LinkList L)
{
LinkList S=NULL; //定義頭指針
S = (LinkList)malloc(sizeof(Node)); //這步必須有,這是尊嚴
S->next=NULL; //一個空鏈表的尊嚴
while(L->next)
{
LinkList p = (LinkList)malloc(sizeof(Node));
p->data = L->next->data;
p->next = S->next;
S->next = p;
L = L->next;
}
return S;
}
void main()
{
LinkList L=NULL; //定義頭指針
LinkList S=NULL; //定義頭指針
CreateListHead(&L,5); //創建鏈表
//打印創建好的鏈表
LinkList p=L->next;
while(p)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
//逆轉單鏈表並且打印
S = reverse(L);
LinkList q=S->next;
while(q)
{
printf("%d\t",q->data);
q=q->next;
}
}