單鏈表的逆轉:
全部代碼實現如下:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read() { int n; List head=NULL,p=NULL,q=NULL; //head是頭結點,p指的是鏈表的最後一個元素,q指的是要插入鏈表裏的元素 head=(List)malloc(sizeof(Node)); if(!head) exit(0); head->Next=NULL; p=head; scanf("%d",&n); while(n--) { q=(List)malloc(sizeof(Node)); scanf("%d",&q->Data); q->Next=NULL; p->Next=q; p=q; } return head; } void Print( List L ) { if(!L) return; List p; p=L->Next; while(p) { printf("%d ",p->Data); p=p->Next; } printf("\n"); } List Reverse( List L ,int k) { int cnt=1; List New,Old,tmp; //New是反轉後的鏈表首元素 Old是未反轉鏈表的首元素,tmp是 未反轉鏈表的第二個元素 if(!L) return L; New=L->Next; Old=L->Next->Next; tmp=Old->Next; while(cnt<k) { Old->Next=New; New=Old; Old=tmp; tmp=Old->Next; cnt++; } L->Next->Next=Old; L->Next=New; return L; } int main() { List L1, L2; int k; L1 = Read(); printf("前幾個元素需要逆轉:\n"); scanf("%d",&k); L2 = Reverse(L1,k); printf("逆轉的結果爲:\n"); Print(L2); return 0; }