数据结构第四章(链表逆转(可只逆转前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;
}