实战数据结构(8)_单链表的就地逆置

/************************************************************************/
/*@author lynnbest
问题3:单链表的就地逆置

                                                                     */
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}listnode;

int length(listnode *head);
void InsertListNode(listnode *head,int pos,int data);
void printflist(listnode *head);
void InverseListNode(listnode *head); //单链表的就地逆置

void main()
{
	printf("   单链表的就地逆置	\n");
	printf("----by lynnbest ----\n\n");
	int a[]={1,2,3,4,5,6,7,8,9,10,11};
	int len=sizeof(a)/sizeof(a[0]);
	listnode *head=(listnode *)malloc(sizeof(listnode));//创建头结点 
	if(NULL==head)
	{
		printf("head malloc创建失败\n");
		exit(-1);
	}
	head->next=NULL;
	for(int i=0;i<len;i++)
		InsertListNode(head,i+1,a[i]);
	printf("就地逆置前为:\n");
	printflist(head);
	InverseListNode(head);
	printf("就地逆置后为:\n");
	printflist(head);
}


void InsertListNode(listnode *head,int pos,int data)
{	
	if(pos<1||pos>length(head)+1)
	{
		printf("插入位置错误\n");
		return;
	}
	listnode *pre=head,*q; //pre 先驱指针 q新开辟的节点
	if(NULL==(q=(listnode *)malloc(sizeof(listnode))))
	{
		printf("malloc分配失败\n");
		exit(-1);
	}
	q->data=data;
	q->next=NULL;
	for(int i=1;i<pos;i++)
		pre=pre->next;
	q->next=pre->next;	//先更新新节点next
	pre->next=q;	//在更新pre next

}

int length(listnode *head)
{	
	listnode *p=head->next;
	int count=0;
	while(p!=NULL)
	{
		count++;
		p=p->next;
	}
	return count;
}
void printflist(listnode *head)
{	
	//printf("当前链表元素为:\n");
	listnode *p=head->next;
	while(p!=NULL)
	{
		printf("%3d",p->data);
		p=p->next;
	}
	printf("\n");
}

void InverseListNode(listnode *head)
{
/*	listnode *pre=NULL,*p=head->next,*s;//pre指向头结点,p指向第一个元素
	while(p!=NULL)
	{
		s=p->next;		//s为待逆置节点
		head->next=p;	//p为当前要逆置的点
		p->next=pre;   //将当前指针 指向前一个节点
		pre=p;		//pre 更新
		p=s;		//p更新
	}
*/
	/************************************************************************/
	/*思路:
	1.先把头结点next NULL
	2.然后保存带逆置点
	3.先将逆置的点的next域指向前一个 head->next
	4.在更新 head->next 
	5. 更新p=q;
																		*/
	/************************************************************************/
	listnode *p=head->next,*q;
	head->next=NULL;
	while(p)
	{
		q=p->next;
		p->next=head->next;
		head->next=p;
		p=q;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值