简单链接列表与next-> next交换

时间:2018-04-02 08:21:49

标签: c++ list c++11 swap singly-linked-list

当我试图为简单链接列表中的两个节点构建交换函数时,我遇到了一个奇怪的事情。

包含5个节点的列表。我通过了第一个节点和第三个节点:

//list is the head of the linked list
interchange(list, list->pNext->pNext);

以下是导致问题的唯一指令,使其更简单:

void interchange(SList*& p, SList*& q) {
    p->pNext->pNext = q->pNext->pNext;
}

我的问题是,根据我对编码的理解,相同操作中的左侧成员获得正确成员的值。 p-> pNext-> pNext采用正确的值。 但指针名为" q"在此单一指令后将指向q-> pNext-> pNext。

有人能否对此有所了解? 提前谢谢你们。

3 个答案:

答案 0 :(得分:0)

考虑对interchange(SList*& p, SList*& q)的调用。

您将p = list的值作为参考及其孙q = list->pNext->pNext传递给它,也作为参考。

当您为p->pNext->pNext分配q->pNext->pNext时,您正在修改list->pNext->pNext以指向list->pNext->pNext->pNext->pNext

q = list->pNext->pNext作为参考后,您还要将q修改为指向list->pNext->pNext->pNext->pNext;毕竟q基本上是重命名的list->pNext->pNext

如果您将功能签名更改为void interchange(SList* p, SList* q),则不会修改q,因为当您更改p->pNext->pNext时,它现在只是一个基本指针。

答案 1 :(得分:0)

以下是您目前实施的逻辑

android {
..
     lintOptions {

        checkReleaseBuilds false

    }
}

您将指针B替换为指向D的指针。p = list q = list->pNext->pNext p->pNext->pNext = q->pNext->pNext // Same as list->pNext->pNext = list->pNext->pNext->pNext->pNext // Before list->A->B->C->D // After list->A->D 仍然指向q,现在指向list->pNext->pNext的D,之前list->pNext->pNext->pNext->pNext相当于q->pNext->pNext }。

答案 2 :(得分:0)

您没有显示列表定义,但函数可以按以下方式显示

void interchange( SList*& p, SList*& q ) 
{
    std::swap( p, q );
    std::swap( p->next, q->next );
}

如示范程序中所示。

#include <iostream>
#include <utility>

struct SList
{
    int data;
    SList *next;
};

void push_front( SList * &head, int data )
{
    SList *tmp = new SList { data, head };
    head = tmp;
}

std::ostream & display( SList * &head, std::ostream &os = std::cout )
{
    for ( const SList *current = head; current != nullptr; current = current->next )
    {
        os << current->data << ' ';

    }

    return os;
}

void interchange( SList*& p, SList*& q ) 
{
    std::swap( p, q );
    std::swap( p->next, q->next );
}

int main() 
{
    SList *head = nullptr;
    const int N = 10;

    for ( int i = N; i != 0; )
    {
        push_front( head, --i );
    }

    display( head ) << std::endl;

    interchange( head, head->next->next );  

    display( head ) << std::endl;

    return 0;
}

程序输出

0 1 2 3 4 5 6 7 8 9 
2 1 0 3 4 5 6 7 8 9