數據結構第四章(鏈表逆轉(可只逆轉前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;
}