c语言中链表如何交换节点?

c语言中链表如何交换节点?,第1张

链表交换节点有两种方式:

1.

交换结点内容

2.

交换结点位置

如定义以下结构体,分为数据部分和链表指针部分

struct _data {

int num

float score

}

struct stu

{

struct _data data

struct stu *next

}*head, *p1,*p2,*p3,*p4

head->p1->p2->p3->p4 交换结点内容,结点顺序不变,依然保持原样,则交换两个结点时,只交换数据部分,next指针不要动,如:交换p1和p3的内容(数据):

struct _data t=p1->datap1->data=p3->datap3->data=t //这样就可以了。交换结点位置,链表的顺序会发生变化,为保持链表的正常衔接,则要重新设置next的值,过程略有复杂,如:交换p1,p3的位置:最终变成:head->p3->p2->p1->p4

首先,要找到p1的原前趋结点head,和p3的前趋结点p2

然后,开始重新分配链表的排列:

1、p1的原前趋结点(head)的新后继结点 要变成p3

2、p1的新后继结点要变成p3的原后继结点(p4)

3、p3的原前趋结点(p2)的新后继结点 要变成p1

4、p3的新后继结点要变成p1的原后继结点(p2)

struct stu *p1p, *p3p, *p

for( p=headp!=NULLp=p->next )

{

if ( p->next==p1 )

p1p=p//找到p1的前趋head

if ( p->next==p3 )

p3p=p//找到p3的前趋p2

}

p1p->next=p3//p1的原前趋结点 的 新后继结点 变成p3 head->p3

struct stu *tNext=p1->next //保存p1的原后继结点(p2)

p1->next=p3->next//p1的新后继结点要变成p3的原后继结点(p4) p1->p4

p3p->next=p1//p3的原前趋结点 的 新后继结点 变成p1 p2->p1

p3->next=tNext //p3的新后继结点 变成p1的原后继结点 p3->p2

c++链表实现节点转换有两种方法:

1)结点交换时机上可以看成是节点里的值交换;

2)直接把节点的地址next的指向改变。

例如:交换LnodeA和LnodeB

用while找到节点的前一个节点pA->next = LnodeA,pB->next = LndoeB

然后pTemp = LnodeA->next;

pB->next = LnodeA

LndoeA ->next = LnoedeB->next

pA->next = LndoeA

LnodeA->next = pTemp


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9409557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存