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;
}
}
如果有不对的地方,可以评论告诉我,望指导!