数据结构第四章(链表逆转(可只逆转前k个元素))
单链表的逆转:
全部代码实现如下:
#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;
}