繁体   English   中英

指向指针的指针:对链表进行分区

[英]Pointers to pointers: partitioning a linked list

我正在尝试变得更容易使用指针。 因此,为了好玩,我采用了以下C ++函数,该函数将链接列表划分为一个值

void partitionList(lnode<int> *& head, int val) {
    lnode<int> * front = nullptr;
    lnode<int> * back = nullptr;
    lnode<int> * curr = head;

    while (curr) {
        lnode<int> * next = curr->next;
        if (curr->data < val) {
            curr->next = front;
            front = curr;
        } else {
            curr->next = back;
            back = curr;
        }
        curr = next;
    }

    curr = front;
    while (curr->next) {
        curr = curr->next;
    }
    curr->next = back;
    head = front;
}

我试图将其更改为采用C样式的双指针。 我做了一个漫不经心的查找替换,但是没有用。 经过调查,我找到了问题的根源,但我仍然不太了解发生了什么...

void partitionList(lnode<int> ** head, int val) {
    lnode<int> * front = nullptr;
    lnode<int> * back = nullptr;
    lnode<int> ** curr = head;

    while (*curr) {
        lnode<int> * entry = *curr;

        std::cout << (*curr)->data << std::endl; // On second loop, prints 2
        std::cout << entry->data << std::endl; // On second loop, prints 2

        lnode<int> * next = entry->next; // This assignment does something

        std::cout << entry->data << std::endl; // On second loop, prints 2
        std::cout << (*curr)->data << std::endl; // On second loop, prints 3!

        if ((*curr)->data < val) {
            (*curr)->next = front;
            front = *curr;
        } else {
            (*curr)->next = back;
            back = *curr;
        }
        curr = &next;
    }

    *curr = front;
    while ((*curr)->next) {
        (*curr) = (*curr)->next;
    }
    (*curr)->next = back;
    head = &front;
}

int main() {
    lnode<int> * tail = new lnode<int>(8, nullptr);
    lnode<int> * seven = new lnode<int>(7, tail);
    lnode<int> * six = new lnode<int>(6, seven);
    lnode<int> * five = new lnode<int>(5, six);
    lnode<int> * four = new lnode<int>(4, five);
    lnode<int> * three = new lnode<int>(3, four);
    lnode<int> * two = new lnode<int>(2, three);
    lnode<int> * head = new lnode<int>(1, two);

    partitionList(&head, 6);
}

在第一个循环中,在函数while循环顶部附近的所有四个调试打印行均打印“ 1”。 但是,在第二个循环中,它们显示“ 2”,“ 2”,“ 2”,“ 3”吗?

谁能解释这是怎么回事? 使用双指针而不是对指针的引用的正确方法是什么?

谢谢!

void partitionList(lnode<int> *& head, int val) {
    ...
    head = front; // <= head is modified
}

但是这里不是

void partitionList(lnode<int> ** head, int val) {
    ...
    head = &front; // try it with *head = front
}

如果您想对此进行快速替换

void partitionList(lnode<int> *& head, int val) {
   ...
   lnode<int> * curr = head;

只需这样写:

void partitionList(lnode<int> ** head, int val) {
    ...
    lnode<int> * curr = *head;

为什么将*cur修改为**cur

暂无
暂无

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

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