Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的反向链表_Java_Pointers_Data Structures_Linked List - Fatal编程技术网

java中的反向链表

java中的反向链表,java,pointers,data-structures,linked-list,Java,Pointers,Data Structures,Linked List,我想知道这是否是一个有效的递归解决方案,以及是否可以进行任何改进。我已经用一些输入测试了这个解决方案,它似乎是有效的 public Node reverse(Node head) { if(head == null) { return null; } if (head.next == null) { this.head = head; return head; } Node n = head.next; head.next = null; reverse(n

我想知道这是否是一个有效的递归解决方案,以及是否可以进行任何改进。我已经用一些输入测试了这个解决方案,它似乎是有效的

public Node reverse(Node head) {

if(head == null) {
    return null;
}

if (head.next == null) {
    this.head = head;
    return head;
}

Node n = head.next;
head.next = null;   

reverse(n).next = head; 

return head;
}

谢谢。

在算法方面,我认为这种方法符合您的要求,我相信您需要一个链表

A->B->C

转化为

C->B->A,然后返回A

我只是对这个方法的范围有点困惑,它是Node的实例方法吗?第8行的“这”是什么

有一件事我不确定,如果你不保留其他指向C和B的指针,在反向操作完成后,你会看到列表C->B->A,返回指向A的指针。看起来C和B没有被任何变量指向,它不会被垃圾收集吗?然后被移除?也许这个问题是通过“这个”东西解决的

构造列表的一个好方法应该是返回列表头的方法。但是您的方法返回尾部。 我建议将其作为Node的实例方法,然后使用head调用reverse()方法,并返回新的head

public Node reverse() {

    if (this.next == null) {    
        return this;
    }

    Node n = this.next;
    Node newhead=n.reverse()  // After reverse, n should be at the tail 
    n.next = this; 

    return newhead;
}

类似于此,但我尚未测试代码

是否要基于头部节点进行反转?还是要反转完整的节点列表?我要反转整个列表,然后返回新的头节点。谢谢。实际上我想返回头部,但忘记添加实现。reverse()不应该是链表类的实例吗?我们不是在这里颠倒列表吗?我现在明白你的意思了,很抱歉,我没有意识到这个方法在linkedlist中。在您的情况下,代码可以正常工作。这只是不同的编码风格,我总是对节点对象进行递归,尤其是对列表、树和其他对象。如果您要扩展原始的java.util.LinkedList,那么我建议您查看源代码,我认为这里的变量不仅仅是头。据我所知,还有“first”、“last”等。谢谢,不,我只是在练习编写递归代码,还列出了相关代码。如何使代码返回新的头部而不是尾部?而且,我也不太明白我的“head.next=null;”代码行是如何工作的。我写它是为了将原始头部设置为null,但它不会每次都将头部设置为null吗?@Prasanna在您的方法中,最终返回的“头部”实际上是新的尾部,因此将下一个设置为null是正确的做法。设置整个链表标题的位置实际上是this.head=head;这是有道理的,当你到达当前列表的末尾时,你将其设置为新的头部。所以,如果您有原始的LinkedList l1,在您进行反向操作之后,您将得到一个新列表。节点n=l1。反向(l1.head)n将是原始的head,它是新的列表尾部。l1本身发生了变化,当您再次呼叫l1.head时,您将获得原始的尾巴。再次感谢您帮助我。对不起,我不太明白为什么要退回头部。在我的程序中,如果输入列表是1->2>3>4,列表将更改为4->3->2->1,但我返回1,这是4的旧头整数,这是我打算返回的。我该怎么做?我认为设置this.head=head可以做到这一点,因为当代码到达原始列表的末尾时,我会这样做,但为什么它不能按预期工作呢?