单链表的逆转:
全部代码实现如下:
#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; }