繁体   English   中英

如何为双向链表创建交换功能?

[英]How do you create a swap function for doubly linked lists?

我在为双向链表创建交换功能时遇到问题。 我想简单地“重新连接”列表,而不更改任何值(我知道这很容易)。 我试图创建此临时项以保留back<-p->front以便可以将q =设置为此前后,但是临时项随p一起变化。 如何在没有临时物品的情况下交换这些物品,或者如何使我的临时物品正常工作。

void DLinkedList::swap(Item *p, Item *q)
{
    Item* temp = p;
    p->next = q->next;
    p->pre = q->pre;
    if (p->next != NULL)
        p->next->pre = p;
    if (q->next != NULL)
        q->next->pre = q;
    q->next = temp->next;
    q->pre = temp->pre;
    if (p->pre != NULL)
        p->pre->next = p;
    if (!q->pre == NULL) {
        q->pre->next = q;
    }
    cout << "- The items " << p->val << " & " << q->val << " were swapped -" << endl;
}

这是图片形式的情况:

+----------+       +----------+       +----------+
| before_p |  <->  |     p    |  <->  | after_p  |
+----------+       +----------+       +----------+

+----------+       +----------+       +----------+
| before_q |  <->  |     q    |  <->  | after_q  |
+----------+       +----------+       +----------+

您遇到的问题是将temp指针保存到p实际上不会将指针复制到p 因此,当您覆盖它们时,就会遇到麻烦。

现在,图片中的那些“之前”和“之后”项才是您真正想要的。 只需将它们复制出来然后进行逻辑操作就容易得多。 查看以下代码更清楚:

Item * before_p = p->pre;
Item * before_q = q->pre;
Item * after_p = p->next;
Item * after_q = q->next;

// Relink before and after nodes
if( before_p ) before_p->next = q;
if( before_q ) before_q->next = p;
if( after_p ) after_p->pre = q;
if( after_q ) after_q->pre = p;

// Relink nodes themselves
p->pre = before_q;
q->pre = before_p;
p->next = after_q;
q->next = after_p;

在执行任何操作之前,您可能还需要进行健全性测试:

if( p == q || !p || !q ) return;

最后,如果您要维护指向列表头的某个位置的指针,而该指针恰好是交换的项之一,请不要忘记在更新之后*。

if( head == p ) head = q;
else if( head == q ) head = p;

(*)其他指针(如tail

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM