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

反转单链表中的备用K节点

祝昊东
2023-03-14

我把这个问题和Java解决方案从http://www.geeksforgeeks.org/reverse-alternate-k-nodes-in-a-singly-linked-list/

给定一个链表,编写一个函数来反转每个交替的k节点输入:1-

在他们的java代码中:我真的不明白为什么需要步骤2)。除了kAltReverse(node node,int k)中的第一个参数外,node没有在其他任何地方使用。方法中的这个node参数在每次递归中都被分配给一个新的变量current。然后在每个递归中使用current、prev和next变量。

那么为什么需要node.next=step2)中的电流呢?

 Node kAltReverse(Node node, int k) {
    Node current = node;
    Node next = null, prev = null;
    int count = 0;

    /*1) reverse first k nodes of the linked list */
    while (current != null && count < k) {
        next = current.next;
        current.next = prev;
        prev = current;
        current = next;
        count++;
    }

    /* 2) Now head points to the kth node.  So change next 
     of head to (k+1)th node*/
    if (node != null) {
        node.next = current;   **// why node.next should be moved to current even though node is not impacting on anywhere else in 3), 4)???**
    }

    /* 3) We do not want to reverse next k nodes. So move the current 
     pointer to skip next k nodes */
    count = 0;
    while (count < k - 1 && current != null) {
        current = current.next;
        count++;
    }

    /* 4) Recursively call for the list starting from current->next.
     And make rest of the list as next of first node */
    if (current != null) {
        current.next = kAltReverse(current.next, k);
    }

    /* 5) prev is new head of the input list */
    return prev;
}

共有1个答案

凤棋
2023-03-14

您的问题实际上与递归没有任何关系,在这个方法中,递归可以通过简单地保留第一个prev来避免,而是将大部分代码包装在time循环中。这个问题都是关于参考文献的。

该过程重新排列链。就在有问题的代码之前,你有两个没有连接的链表:

3->2->1->null 4->5->...
\prev \node   \current

当设置node.next时,您正在更改节点引用的对象上的属性。因此,您正在替换指向不同对象的引用。当node.next用作值时,您将获得对对象的引用。在完成node.next=当前之后,您将得到以下内容:

3->2->1->4->5->...
\prev \  \current
       \node
 类似资料:
  • 问题内容: 必须是O(n)并且是就地(空间复杂度为1)。下面的代码可以工作,但是有没有更简单或更完善的方法? 问题答案: 编辑以删除每次迭代的额外比较:

  • 本文向大家介绍如何反转单链表相关面试题,主要包含被问及如何反转单链表时的应答技巧和注意事项,需要的朋友参考一下 考察点:链表    

  • 我做了一个使用递归方法反转单链表的函数。然而,我在执行下面的代码时遇到了一些困难: 我应该如何在ReverseCursive函数/方法中传递第二个参数,以便执行它? 作为第二个参数,我想简单地传递链表的头节点。但是我不知道如何从类的init方法中获取头节点linked_list 我试了几件事,但都解决不了。也许我不太擅长OOP概念。有人能帮我解决这个问题吗?

  • 我正在为一个CS类做一些家庭作业,并且正在努力使用一个函数来反转两个给定节点之间的双链接列表。我对自己做错了什么感到困惑,我在谷歌上搜索过,但找不到任何有帮助的东西。 我有一个双链表,我基本上使用这个函数作为辅助函数,在两个节点之间反转它,这两个节点作为函数的参数。 下面是模板的代码,有注释以便您了解我的思考过程 那么,有什么想法吗?我已经知道问题发生在哪里,是什么,但是我还不知道为什么会发生,以

  • 问题内容: 我被要求反转一个以head为参数的参数,其中head是一个链表,例如:1-> 2-> 3这是从已经定义的函数返回的,我试图以这种方式实现函数reverse_linked_list: 称为:。我编写的用于反转列表的函数具有给定的功能,并且仅适用于长度为3的列表。如何将其概括为长度为列表的? 问题答案: U可以使用mod函数获取每次迭代的余数,并且显然可以帮助反转列表。我想你是R和D团的学

  • 一、题目 输入一个链表,输出该链表中倒数第k 个结点。为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点。 二、解题思路 为了实现只遍历链表一次就能找到倒数第k 个结点,我们可以定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1步,第二个指