链表面试题(二)

5 【逆置/反转单链表】 6【 单链表排序(冒泡排序)】,7 【合并两个有序链表,合并后依然有序】,8【求两个已排序单链表中相同的数据】
创建链表或是打印链表在上一篇,戳链接 点击打开链接
5【逆置/反转单链表】,创建一个新结点作为逆置链表的尾,从链表第一个结点开始,复制该结点并头插到逆置链表上,一直复制到原链表的最后一个结点,最后返回逆置好的链表
SListNode* SListReverse(SListNode* list)
{
	if (list == NULL || list->_next == NULL)
	{
		return list;
	}
	SListNode* ReverseList = NULL;
	SListNode* pCurrent = list;
	while (pCurrent != NULL)
	{
		SListNode* pTemp = pCurrent;
		pCurrent = pCurrent->_next;
		pTemp->_next = ReverseList;
		ReverseList = pTemp;
	}
	return ReverseList;
}
6【单链表排序(冒泡排序)】,弄三个结点,分别在链表的尾(尾巴结点),链表的前两个,前两个从前往后依次比较,筛选出最大的,一轮下来,最大的就在尾,把尾巴结点往前放一个即就是刚比较完的前面结点的位置,把两个比较结点再从头开始向后比较,筛选最大的,直到尾巴结点到链表头处,那么排序就完成了(升序)
void SListBubbleSort(SListNode* list)
{
	assert(list);
	SListNode* pTail = list;
	SListNode* pcur = list->_next;
	SListNode* pnext = pcur->_next;
	while (pTail->_next != NULL)
	{
		pTail = pTail->_next;
	}
	while (list->_next != pTail)
	{
		pcur = list->_next;
		pnext = pcur->_next;
		while (pnext->_next != NULL)
		{
			if (pcur->_data > pnext->_data)
			{
				int tmp = pcur->_data;
				pcur->_data = pnext->_data;
				pnext->_data = tmp;

				pcur = pnext;
				pnext = pnext->_next;
			}
			else
			{
				pcur = pnext;
				pnext = pnext->_next;
			}
		}
		pTail = pcur;
	}
}
7【合并两个有序链表】,合并后依然有序,假设两个链表都是升序的,先比较俩链表的头结点谁比较小,较小的内个结点就做新链表的头,然后俩链表一个结点一个结点的比较,直到一个比完了,把剩下内个接到新链表上就可以了
SListNode* SListMerge(SListNode* list1, SListNode* list2)
{
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;
	SListNode* NewList = NULL;
	if (list1->_data < list2->_data)
	{
		NewList = list1;
		NewList->_next = NULL;
		list1 = list1->_next;
	}
	else
	{
		NewList = list2;
		NewList->_next = NULL;
		list2 = list2->_next;
	}
	SListNode* pTmp = NewList;
	while (list1 != NULL&&list2 != NULL)
	{
		if (list1->_data < list2->_data)
		{
			pTmp->_next = list1;
			list1 = list1->_next;
			pTmp = pTmp->_next;
			pTmp->_next = NULL;
		}
		else
		{
			pTmp->_next = list2;
			list2 = list2->_next;
			pTmp = pTmp->_next;
			pTmp->_next = NULL;
		}
	}
	if (list1 != NULL)
		pTmp->_next = list1;
	else
		pTmp->_next = list2;
	return NewList;
}

8【求两个已排序单链表中相同的数据】,从俩链表的头开始比较,谁小谁就往前走一个(->next),相等的话就打印出来然后都往前走一个,一直到有一个链表走完了,完了也就没有比较的必要了
void UnionSet(SListNode* l1, SListNode* l2)
{
	assert(l1);
	assert(l2);
	SListNode* pNode1 = l1;
	SListNode* pNode2 = l2;
	while (l1&&l2)
	{
		if (pNode1->_data == pNode2->_data)
		{
			printf("%d", pNode1->_data);
			pNode1 = pNode1->_next;
			pNode2 = pNode2->_next;
		}
		else if (pNode1->_data > pNode2->_data)
		{
			pNode2 = pNode2->_next;
		}
		else
			pNode1 = pNode1->_next;
	}
}

如果有不对的地方,可以评论告诉我,望指导!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值