数据结构 - 链表与算法

基础知识

参考:
十大排序算法总结 https://www.zhihu.com/tardis/sogou/art/42586566

1 结点位置

1.1 求链表中间结点

LinkList* Find_InterNode(LinkList* HeaderList)
{
	PT_Link ptHeaderList = (PT_Link)HeaderList;
	assert(NULL != ptHeaderList);
	PT_Link FastNode = ptHeaderList;
	PT_Link SlowNode = ptHeaderList;
	
	while((NULL != FastNode) && (NULL != FastNode->next))
	{
		FastNode = FastNode->next->next;
		SlowNode = SlowNode->next;
	}
	return SlowNode;
}

1.2 求倒数第N个结点

LinkList* Find_NthNode(LinkList* HeaderList, int n)
{
	PT_Link ptHeaderList = (PT_Link)HeaderList;
	assert((NULL != ptHeaderList) && (n > 0));
	PT_Link FastNode = ptHeaderList;
	PT_Link SlowNode = ptHeaderList;
	int i = 0;
	
	for(i=0; i<n-1; i++) // 先让FastNode走N-1步
	{
		if(NULL != FastNode->next)
		{
			FastNode = FastNode->next;
		}
		else
		{
			return NULL;
		}
	}
	
	while(FastNode->next) // 剩下的一起走
	{
		FastNode = FastNode->next;
		SlowNode = SlowNode->next;
	}
	return SlowNode;
}

2 链表排序

2.1 冒泡排序

void LinkList_BubbleSort(LinkList* HeaderList)
{
	PT_Link ptHeaderList = (PT_Link)HeaderList;
	PT_Link p;
	PT_Link q;
	for(p=ptHeaderList->next; p!=NULL; p=p->next)
	{
		for(q=p->next; q!=NULL; q=p->next)
		{
			if(p->data > q->data)
			{
				int tempdata = p->data;
				p->data = q->data;
				q->data = tempdata;
			}
		}
	}
}

2.2 快速排序

LinkList* FindEndList(LinkList* HeaderList)
{
	PT_Link ptHeaderList = (PT_Link)HeaderList;
	PT_Link ptLink = ptHeaderList;
	while(ptLink->next)
	{
		ptLink = ptLink->next;
	}
	return ptLink;
}

LinkList* FindPiovt(LinkList* ListBegin, LinkList* ListEnd)
{
	/* 前后指针法 */
	PT_Link pivot = (PT_Link)ListBegin;
	PT_Link FrontNode = (PT_Link)ListBegin; // 表头
	PT_Link ptEndList = (PT_Link)ListEnd; //表尾
	assert(NULL != FrontNode && NULL != ptEndList);
	
	PT_Link NextNode = FrontNode->next;
	
	while((FrontNode != ptEndList) && (NextNode->next != NULL))
	{
		if(NextNode->data < pivot->data)
		{
			FrontNode = FrontNode->next;
			int swap_data = FrontNode->data;
			FrontNode->data = NextNode->data;
			NextNode->data = swap_data;
		}
		
		NextNode = NextNode->next;
	}
	int data = pivot->data;
	pivot->data = FrontNode->data;
	FrontNode->data = data;
	return FrontNode;
}

void LinkList_QuickSort(LinkList* ListBegin,LinkList* ListEnd)
{
	PT_Link ptListBegin = (PT_Link)ListBegin; // 表头
	assert(NULL != ptListBegin);
	PT_Link ptEndList = (PT_Link)ListEnd; //表尾
	if(ptListBegin != ptEndList)
	{
		if(-1 == ptListBegin->data)
		{
			ptListBegin = ptListBegin->next;
		}
		PT_Link pivot = (PT_Link)FindPiovt((LinkList*)ptListBegin, (LinkList*)ptEndList);
		LinkList_QuickSort((LinkList*)ptListBegin, (LinkList*)pivot);
		LinkList_QuickSort((LinkList*)pivot->next, (LinkList*)ptEndList);
	}
}

[资源]https://download.csdn.net/download/moliyw/11824799

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值