当前位置: 首页 > 知识库问答 >
问题:

反转两个节点之间的链表

司马庆
2023-03-14

我正在为一个CS类做一些家庭作业,并且正在努力使用一个函数来反转两个给定节点之间的双链接列表。我对自己做错了什么感到困惑,我在谷歌上搜索过,但找不到任何有帮助的东西。

我有一个双链表,我基本上使用这个函数作为辅助函数,在两个节点之间反转它,这两个节点作为函数的参数。

下面是模板的代码,有注释以便您了解我的思考过程

template <class T>
void List<T>::reverse( ListNode * & startPoint, ListNode * & endPoint )
{
    //make sure that none of the pointers are null and that the start and 
    //end points aren't the same
    if(startPoint == NULL || endPoint == NULL || startPoint == endPoint)
        return;
    //Make two nodes denoting everything happening before the
    //start and everything after the end
    ListNode *before = NULL;
    ListNode *after = NULL;
    if(startPoint->prev != NULL)
        before = startPoint->prev;
    if(endPoint->next != NULL)
        after = endPoint->next;
    ListNode *temp = startPoint;
    ListNode *temp2;
    //run a loop actually reversing the list. I have identified
    //that this is where the problem is happening (obviously)
    //for some reason the prev pointer for every node is being set to null
    //so if I had a linked list with 1 2 3 4 5
    //after running this it's just 5
    while(temp!=endPoint && temp!=NULL){
        temp2 = temp->next;
        if(temp->prev!=NULL);
            temp->next = temp->prev;
        if(temp2!=NULL)
            temp->prev = temp2;
        temp = temp2;

    }
    //switch around the end and start pointers
    endPoint = startPoint;
    startPoint = temp;
    //make sure it's integrated into the rest of the linked list
    if(before != NULL){
        before->next = startPoint;
        startPoint->prev = before;
    }
    if(after != NULL){
        after->prev = endPoint;
        endPoint->next = after;
    }
}

那么,有什么想法吗?我已经知道问题发生在哪里,是什么,但是我还不知道为什么会发生,以及如何解决它。

此外,如果你认为我在做一些多余或不必要的事情,请随时告诉我,我有时会这样做。

编辑:这是一个包含函数,所以如果您在链表{1, 2, 3, 4, 5, 6}上调用它,指针指向值为2和5的节点,那么链表将被更改为{1, 5, 4, 3, 2, 6}

共有1个答案

帅彦
2023-03-14

问题在于子列表的结尾。

您还没有给出一个完整的示例(这可能会有所帮助),但是假设我们从列表{1, 2, 3, 4, 5}开始,我们尝试反向(s, e),其中se是指向2和4的指针。(所以我们想要的结果是{1, 4, 3, 2, 5}。)

这就是我ASCII art技能失败的地方,但“下一个”和“上一个”指针如下所示:

1-->2-->3-->4-->5

1<--2<--3<--4<--5

当控件离开while循环时,它们如下所示:

1<->2<--3   4-->5
1   2-->3<->4<--5

这几乎是我们的意图,但该过程很快停止了一个节点(4没有被颠倒)。在“集成到列表的其余部分”之后,它们看起来像这样:

  ________ ___
 /   /    \   \
1   2<--3  >4-->5
1   2-->3-->4   5
 \___\_____/___/

不是很清楚,但是如果你从列表的开头开始向前移动,它会变成{1,4,5},如果你从末尾向后移动,它会变成{5,2,3,4,1}。您打破了双重链接条件,即如果a.next指向b,则b.prev指向a,反之亦然。

我的建议(除了用铅笔和纸画更多的箭头)是从列表中删除子列表,将其反转,然后将其拼接回来;试图在适当的位置反转它是令人困惑的。

 类似资料:
  • 问题内容: 我正在使用networkx处理图。我有一个很大的图(其中有近200个节点),我尝试查找两个节点之间的所有可能路径。但是,据我了解,networkx只能找到最短的路径。如何不仅获得最短路径,还获得所有可能路径? UPD:路径只能包含每个节点一次。 UPD2:我需要类似find_all_paths()函数的功能,在此进行描述:python.org/doc/essays/graphs.htm

  • 我正在尝试编写一个函数,它接受一个项目并将其插入双向链表的前端。双向链表有两个虚拟节点,两端各一个。我迄今为止编写的方法在迭代列表并打印时只返回两个虚拟节点。我无法弄清楚我的代码有什么问题。 当我运行main时,我得到的只是: 然而,我预计: 有谁能告诉我如何修复代码,以便在双链接列表的开头添加一个项目,在两个虚拟的第一个和最后一个节点之间?

  • 我正在尝试使用(不平衡的)BST实现树集。我还希望为树中的所有节点维护一个有序的双链接列表。 链表是在2个前哨节点的帮助下维护的,一个头节点和一个尾节点。因此,要遍历链表,您需要从头节点开始,检查它的属性。 我有一个递归的方法,就像这样; 其中和设置在链表中将插入新节点的位置的边界。 我在维护节点的和属性时遇到了问题。

  • 王国连通性 对查尔斯国王来说,这是繁荣的一年,他正在迅速扩大他的王国。一个美丽的新王国最近已经建成,在这个王国里有许多城市由多条单向道路连接。两个城市可能由多条道路直接连接,这是为了确保高度连接。 在这个新王国中,查尔斯国王将其中一个城市作为他的金融首都,另一个作为战争首都,他希望这两个首都之间有高度的连通性。一对城市的连通性,比如城市A和城市B,被定义为从城市A到城市B的不同路径的数量。如果可能

  • 我把这个问题和Java解决方案从http://www.geeksforgeeks.org/reverse-alternate-k-nodes-in-a-singly-linked-list/ 给定一个链表,编写一个函数来反转每个交替的k节点输入:1- 在他们的java代码中:我真的不明白为什么需要步骤2)。除了kAltReverse(node node,int k)中的第一个参数外,node没有在

  • 我试图找到树中两个节点之间的最大距离。这是我的程序: 程序似乎正在运行;但是没有为一些测试用例显示正确的输出。我采取的方法是: 求根节点的子节点数(我一直认为根节点为0)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?