数值与后继节点交换
设有一个由正整数组成的无序单链表,编写完成下列功能的算法
- 找出最小值节点,打印改值
- 若该数值是奇数,将其与直接后继节点的数值交换
- 若该数值是偶数,将其直接后继节点删除
算法思想
遍历整个链表查找最小值节点,从第一个节点开始找
判断数据域的值是否是奇数,若是,与后继节点的值交换
若是偶数,删除后继节点
![![[Pasted image 20241112190102.png]]](https://i-blog.csdnimg.cn/direct/9c01c1763e0b4f328bd27f3dfbaff0b0.png)
cur和MIn指针都指向L的next
cur开始遍历,如果cur的next也就是待比较的节点比Min小,将Min指向cur的next
![![[Pasted image 20241112190154.png]]](https://i-blog.csdnimg.cn/direct/6e45284dc7ab403784fcf82afde64b92.png)
直到cur的next为NULL结束
如果Min的data是奇数,如果后继节点不为NULL,与后继节点交换数值
如果Min的data是偶数,如果后继节点不为NULL,
创建指针del指向Min的next
![![[Pasted image 20241112190548.png]]](https://i-blog.csdnimg.cn/direct/0f41325b0c6644d591d2288c32faee4f.png)
将Min的next指向del的next,这里是NULL
![![[Pasted image 20241112190920.png]]](https://i-blog.csdnimg.cn/direct/8b8b5f43bfd04e22ba9e83b2cd0b3744.png)
最后free掉del
![![[Pasted image 20241112190941.png]]](https://i-blog.csdnimg.cn/direct/d9418a64f3384a3bba5fc173cd773a91.png)
void MiniValue(LinkList &L)
{
// cur是工作指针
LNode* cur = L->next;
// Min指向最小值节点,初始假定第一个节点值最小
LNode* Min = cur;
// cur->next是带比较的当前节点
while (cur->next)
{
if (cur->next->data < Min->data)
Min = cur->next;
// 后移指针
cur = cur->next;
}
printf("最小值=%d\n", Min->data);
// 处理奇数
if (Min->data % 2)
{
// 若该节点没有后继,则不必交换
if (Min->next)
{
int tmp = Min->data;
Min->data = Min->next->data;
Min->next->data = tmp;
}
}
// 处理偶数
else
{
// 若最小值节点是最后一个节点,则无后继
if (Min->next)
{
LNode* del = Min->next;
Min->next = del->next;
free(del);
}
}
}
两两交换节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点,不修改节点的数值
算法思想
可以通过递归方式实现两两交换链表中的节点
递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换
如果链表中至少有两个节点,则在两两交换节点之后,原始链表的头节点变成新链表的第二个节点,原始链表的第二个节点变成新链表的头节点。链表中其余节点的两两交换可以递归地实现
在对链表的其余节点递归地两两交换之后,更新节点之间地指针关系,即可完成整个链表的两两交换
用head表示原始链表的头节点,新的链表的第二个节点,用newHead表示新链表的头节点,原始链表的第二个节点,则原始链表中其余节点的头节点是newHead->next
令head的next=swapPairs(newHead),表示将其余节点进行两两互换,交换后的新的头节点为head的下一个节点,然后令newHead的next指向head,完成了所有的两两互换
最后返回新的链表的头节点,newHead
LNode* swapPairs(LinkList &head)
{
if (head == NULL || head->next == NULL)
return head;
LNode* newHead = head->next;
head->next = swapPairs(newHead->next);
newHead->next = head;
return newHead;
}
开始将head节点指向的单链表传入swapPairs函数
head及head的next均不为NULL
创建指针newHead指向head的next
![![[Pasted image 20241112192209.png]]](https://i-blog.csdnimg.cn/direct/d3536b9202cb46cb9f4f62af69f22684.png)
将newHead的next传入swapPairs函数,返回的头节点链在head的后面,用head的next
![![[Pasted image 20241112193210.png]]](https://i-blog.csdnimg.cn/direct/b599836070ab4118a7c4593533e1401b.png)
进入到下一个栈帧
![![[Pasted image 20241112193421.png]]](https://i-blog.csdnimg.cn/direct/e2ed6ffdf5764ca19656826343df5754.png)
继续将newhead的next传入下一层递归
![![[Pasted image 20241112193601.png]]](https://i-blog.csdnimg.cn/direct/bb9730f64ed443a788cd7d1c92457951.png)
这一层head的next为NULL,递归返回head节点
用上一层的head的next指向这次返回的head节点
![![[Pasted image 20241112193738.png]]](https://i-blog.csdnimg.cn/direct/7f21ffffa4c946f3a70a9692f33fc928.png)
newhead的next指向head节点
![![[Pasted image 20241112193809.png]]](https://i-blog.csdnimg.cn/direct/b0fae335c49f48d68c126e543aab0c9b.png)
返回newhead,将第一层的head的next指向返回的newhead
![![[Pasted image 20241112193931.png]]](https://i-blog.csdnimg.cn/direct/ce04dcb2e1dc470580e4b7cc519048ff.png)
newhead的next指向第一层的head
完成交换
![![[Pasted image 20241112194010.png]]](https://i-blog.csdnimg.cn/direct/9b6822a617564ada86ea2509f4d0eee6.png)
交换当前节点与后继节点
编写一个算法交换单链表中指针P所指节点与其后继节点,head是该链表的头指针,P指向该链表中某一节点
算法思想
从头节点开始查找p指针所指节点
要求p指针所指节点与其后继节点交换,需要直到p的前驱节点
这样才能让原p节点的前驱指向原p节点的后继节点
创建一个工作指针cur遍历链表,同时用指针prev保存cur的前一个指针的地址
![![[Pasted image 20241112191227.png]]](https://i-blog.csdnimg.cn/direct/cac439780e294f90bd5e5ae8ecc92c23.png)
一直往后遍历,直到cur指向p
![![[Pasted image 20241112191253.png]]](https://i-blog.csdnimg.cn/direct/639863b22e84413a80dfab22e8d89f50.png)
判断p的next是否为NULL,如果不为空,再进行交换
cur指向p的next
![![[Pasted image 20241112191345.png]]](https://i-blog.csdnimg.cn/direct/1dd67478e9ad422c9176ed7e331453bc.png)
prev的next指向cur
![![[Pasted image 20241112191412.png]]](https://i-blog.csdnimg.cn/direct/ded08dd751d44a41b57253b471c54706.png)
p的next指向cur的next
![![[Pasted image 20241112191520.png]]](https://i-blog.csdnimg.cn/direct/c9d191b363214037aa728c4306132ca6.png)
cur的next指向p
![![[Pasted image 20241112191543.png]]](https://i-blog.csdnimg.cn/direct/2802fa683bcc43d6936db3e18dcaae23.png)
完成交换
LinkList Exchange(LinkList &head, LNode* p)
{
// cur是工作指针,指向链表中当前待处理节点
LNode* cur = head->next;
// prev是前驱节点指针,指向p的前驱
LNode* prev = head;
while (cur && cur != p)
{
// 未找到p节点,后移指针
prev = cur;
cur = cur->next;
}
if (p->next == NULL)
printf("p无后继节点\n");
// 处理p节点和后继节点交换
else
{
// 暂存p的后继
cur = p->next;
prev->next = cur;
p->next = cur->next;
cur->next = p;
}
}
2056



被折叠的 条评论
为什么被折叠?



