OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

链式有序表的合并中,为什么要把第二个表的头结点释放掉?

jmyz_0455
jmyz_0455 发布于 2016年01月30日
无人欣赏。

在链式有序表的合并中,假设头指针为 LA 和 LB 的单链表分别为线性表 LA 和 LB 的存储结构,归并 LA 和 LB 得到单链表 LC。

网上很多教材的算法描述里,最后都要把 LB 的头结点释放掉,就这一点我想不明白。请问:

1、为什么要释放 LB 的头结点?

2、那么释放掉头结点的线性表 LB 是不是就不存在了(被删掉)?

3、如果2的答案是「是」,那么为什么合并线性表 LA 和 LB 之后要只剩下 LA 和 LC ?不应该是三个表都保留吗?

就是想不明白释放 LB 头结点是为了什么,可能我有些基础的概念遗漏了?请各位指点一下。

共5条回复
楼长 ·
wangxl 回复于 2016年01月31日

请上代码截图^_^

我挺好奇是个什么情况^_^

2楼 ·
jmyz_0455 回复于 2016年01月31日

1楼 @wangxl 书本里的代码是这样的,注释没打:

void MergeList_L(LinkList &LA, LinkList &LB, LinkList &LC)

{

pa = LA->next; pb = LB->next;

LC = LA;

pc = LC;

while(pa && pb)

{

if(pa->data <= pb->data)

{

pc->next = pa;

pc = pa;

pa = pa->next;

}

else

{

pc->next = pb;

pc = pb;

pb = pb->next;

}

pc->next = pa ? pa : pb;

delete LB;

}

}

这文字编辑器搞得我都疯了...Markdown 格式嚒,我还是去学一下再来回复

3楼 ·
wangxl 回复于 2016年01月31日
 1 void MergeList_L(LinkList &LA, LinkList &LB, LinkList &LC) {
 2 pa = LA->next; pb = LB->next; 
 3 LC = LA; 
 4 pc = LC; 
 5 while(pa && pb) { 
 6 if(pa->data <= pb->data) { 
 7 pc->next = pa; 
 8 pc = pa; 
 9 pa = pa->next; 
 10 } else { 
 11 pc->next = pb; 
 12 pc = pb; 
 13 pb = pb->next; 
 14 } 
 15 pc->next = pa ? pa : pb; 
 16 delete LB; 
 17 } 
 18 } 

首先, LA/ LB / LC 都是指针

那么,第3行已经让LC 指向LA,所以删除LA就是删除LC所指的空间。

4楼 ·
wangxl 回复于 2016年01月31日

代码一行一行的看,不要求快。

5楼 ·
amosji 回复于 2016年02月04日

LA和LB的头指针都是用了所谓的「哨兵节点」,它们本身是空的节点,所以合并时并不参与。用哨兵节点做头指针是为了简化边界条件。
两个链表合并完之后,LA(LC)是新链表的头指针,仍是一个哨兵节点。这时原本用作LB头指针的这个哨兵节点就没有用了,所以要释放掉。

如果你创建一个链表的时候不使用哨兵节点做头指针,那合并完之后就不可以释放掉LB的头指针。

登录 或者 注册

AltStyle によって変換されたページ (->オリジナル) /