การย้อนกลับรายการที่เชื่อมโยงใน Java แบบวนซ้ำ


101

ฉันทำงานกับโปรเจ็กต์ Java สำหรับชั้นเรียนมาระยะหนึ่งแล้ว เป็นการนำรายการที่เชื่อมโยงไปใช้งาน (ที่นี่เรียกว่าAddressListมีโหนดอย่างง่ายที่เรียกว่าListNode) สิ่งที่จับได้คือทุกอย่างจะต้องทำด้วยอัลกอริธึมแบบวนซ้ำ ฉันสามารถทำทุกอย่างได้ดีโดยใช้วิธีเดียว:public AddressList reverse()

ListNode:

public class ListNode{
  public String data;
  public ListNode next;
}

ตอนนี้reverseฟังก์ชันของฉันเรียกใช้ฟังก์ชันตัวช่วยที่ใช้อาร์กิวเมนต์เพื่ออนุญาตให้เรียกซ้ำ

public AddressList reverse(){
  return new AddressList(this.reverse(this.head));
}

ด้วยฟังก์ชันตัวช่วยของฉันมีลายเซ็นของ private ListNode reverse(ListNode current) .

ในขณะนี้ฉันทำงานซ้ำ ๆ โดยใช้สแต็ก แต่นี่ไม่ใช่สิ่งที่ข้อกำหนดต้องการ ฉันพบอัลกอริทึมใน C ที่ย้อนกลับซ้ำและแปลงเป็นโค้ด Java ด้วยมือและมันใช้งานได้ แต่ฉันไม่เข้าใจมัน

แก้ไข: ไม่เป็นไรฉันคิดออกในระหว่างนี้

private AddressList reverse(ListNode current, AddressList reversedList){
  if(current == null) 
      return reversedList;
  reversedList.addToFront(current.getData());
  return this.reverse(current.getNext(), reversedList);
}

ขณะที่ฉันอยู่ที่นี่มีใครเห็นปัญหาเกี่ยวกับเส้นทางนี้หรือไม่


2
ไม่มีไม่มีปัญหากับโซลูชันของคุณ ในทางตรงกันข้ามมัน "ดี" ยิ่งกว่าโซลูชัน "Little Lisper" ที่เป็นที่ชื่นชอบเนื่องจากช่วยให้รายการดั้งเดิมไม่เสียหาย สิ่งนี้จะมีค่าอย่างยิ่งในการตั้งค่าแบบมัลติคอร์ซึ่งเป็นที่ต้องการอย่างยิ่ง
Ingo

คำตอบ:


318

มีรหัสในการตอบกลับเดียวที่สะกดคำ แต่คุณอาจพบว่าการเริ่มต้นจากล่างขึ้นบนทำได้ง่ายขึ้นโดยการถามและตอบคำถามเล็ก ๆ น้อย ๆ (นี่คือแนวทางใน The Little Lisper):

  1. การย้อนกลับของ null (รายการว่าง) คืออะไร? โมฆะ
  2. อะไรคือสิ่งที่ย้อนกลับของรายการองค์ประกอบหนึ่ง? องค์ประกอบ
  3. สิ่งที่ตรงกันข้ามของรายการองค์ประกอบ n คืออะไร? ย้อนกลับของรายการที่เหลือตามด้วยองค์ประกอบแรก

public ListNode Reverse(ListNode list)
{
    if (list == null) return null; // first question

    if (list.next == null) return list; // second question

    // third question - in Lisp this is easy, but we don't have cons
    // so we grab the second element (which will be the last after we reverse it)

    ListNode secondElem = list.next;

    // bug fix - need to unlink list from the rest or you will get a cycle
    list.next = null;

    // then we reverse everything from the second element on
    ListNode reverseRest = Reverse(secondElem);

    // then we join the two lists
    secondElem.next = list;

    return reverseRest;
}

30
ว้าวฉันชอบ "คำถามสามข้อ" ทั้งหมดนั้น
sdellysse

4
ขอบคุณ. คำถามเล็กน้อยควรเป็นพื้นฐานของการเรียนรู้ Lisp นอกจากนี้ยังเป็นวิธีการซ่อนการเหนี่ยวนำจาก newbs ซึ่งโดยพื้นฐานแล้วรูปแบบนี้คืออะไร ฉันแนะนำให้อ่าน Little Lisper หากคุณต้องการแก้ปัญหาประเภทนี้จริงๆ
แท่น

44
ข้อยกเว้นสำหรับสถานการณ์พิเศษ เหตุใดจึงต้องใช้การจับสำหรับเงื่อนไขที่ทราบซึ่งทดสอบได้โดย if
Luke Schafer

4
ฉันเชื่อว่าคุณไม่จำเป็นต้องสร้างตัวแปร: secondElem เนื่องจาก list.next ยังคงเป็น secondElem หลังจาก "ListNode reverseRest = Reverse (secondElem);" ขั้นแรกคุณสามารถทำ "list.next.next = list" แล้ว "list.next = null" และนั่นแหล่ะ
ChuanRocks

3
คุณอธิบายได้ไหมว่าทำไม list.next = null ฉันพยายามที่จะเข้าใจวงจร แต่ไม่เข้าใจ
Rohit

29

ฉันถูกถามคำถามนี้ในการสัมภาษณ์และรู้สึกรำคาญที่ฉันงอแงเพราะฉันรู้สึกประหม่าเล็กน้อย

สิ่งนี้ควรย้อนกลับรายการที่เชื่อมโยงเดี่ยวเรียกว่าด้วยการย้อนกลับ (head, NULL); ดังนั้นหากนี่คือรายการของคุณ:

1-> 2-> 3-> 4-> 5-> null
มันจะกลายเป็น:
5-> 4-> 3-> 2-> 1-> null

    //Takes as parameters a node in a linked list, and p, the previous node in that list
    //returns the head of the new list
    Node reverse(Node n,Node p){   
        if(n==null) return null;
        if(n.next==null){ //if this is the end of the list, then this is the new head
            n.next=p;
            return n;
        }
        Node r=reverse(n.next,n);  //call reverse for the next node, 
                                      //using yourself as the previous node
        n.next=p;                     //Set your next node to be the previous node 
        return r;                     //Return the head of the new list
    }
    

แก้ไข: ive ทำเหมือนการแก้ไข 6 รายการแสดงว่ามันยังค่อนข้างยุ่งยากสำหรับฉันฮ่า ๆ


2
ฉันรู้สึกอึดอัดเล็กน้อยกับข้อกำหนด "ต้องเรียกซ้ำ" ในการสัมภาษณ์พูดตามตรงถ้าระบุ Java ไม่งั้นจะใช้ p = null; ในขณะที่ (n.next! = null) {n2 = n.next; n.next = p; p = n; n = n2;} n.next = p; กลับ n;. O (N) สแต็คมีไว้สำหรับนก
Steve Jessop

โอ้ใช่ตรวจสอบค่าว่างบนหัวด้วยนี่คือ Java
Steve Jessop

23

ฉันมาได้ครึ่งทาง (จนถึงโมฆะและหนึ่งโหนดตามคำแนะนำของฐาน) แต่สูญเสียการติดตามหลังจากทำการโทรซ้ำ อย่างไรก็ตามหลังจากอ่านโพสต์โดยฐานนี่คือสิ่งที่ฉันคิดขึ้น:

Node reverse(Node head) {
  // if head is null or only one node, it's reverse of itself.
  if ( (head==null) || (head.next == null) ) return head;

  // reverse the sub-list leaving the head node.
  Node reverse = reverse(head.next);

  // head.next still points to the last element of reversed sub-list.
  // so move the head to end.
  head.next.next = head;

  // point last node to nil, (get rid of cycles)
  head.next = null;
  return reverse;
}

ดีมากแค่ชอบทำข้อเสีย :)
Karthikeyan D

9

นี่เป็นอีกหนึ่งวิธีแก้ซ้ำ มีโค้ดภายในฟังก์ชันเรียกซ้ำน้อยกว่าโค้ดอื่น ๆ ดังนั้นจึงอาจเร็วกว่าเล็กน้อย นี่คือ C # แต่ฉันเชื่อว่า Java จะคล้ายกันมาก

class Node<T>
{
    Node<T> next;
    public T data;
}

class LinkedList<T>
{
    Node<T> head = null;

    public void Reverse()
    {
        if (head != null)
            head = RecursiveReverse(null, head);
    }

    private Node<T> RecursiveReverse(Node<T> prev, Node<T> curr)
    {
        Node<T> next = curr.next;
        curr.next = prev;
        return (next == null) ? curr : RecursiveReverse(curr, next);
    }
}

8

อัลโกจะต้องทำงานในรูปแบบต่อไปนี้

  • ติดตามหัว
  • เรียกซ้ำจนจบลิงค์ลิสต์
  • การเชื่อมโยงย้อนกลับ

โครงสร้าง:

Head    
|    
1-->2-->3-->4-->N-->null

null-->1-->2-->3-->4-->N<--null

null-->1-->2-->3-->4<--N<--null

null-->1-->2-->3<--4<--N<--null

null-->1-->2<--3<--4<--N<--null

null-->1<--2<--3<--4<--N<--null

null<--1<--2<--3<--4<--N
                       |
                       Head

รหัส:

public ListNode reverse(ListNode toBeNextNode, ListNode currentNode)
{               
        ListNode currentHead = currentNode; // keep track of the head

        if ((currentNode==null ||currentNode.next==null )&& toBeNextNode ==null)return currentHead; // ignore for size 0 & 1

        if (currentNode.next!=null)currentHead = reverse(currentNode, currentNode.next); // travarse till end recursively

        currentNode.next = toBeNextNode; // reverse link

        return currentHead;
}

เอาท์พุต:

head-->12345

head-->54321

7

ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่สะอาดกว่าซึ่งคล้ายกับ LISP

// Example:
// reverse0(1->2->3, null) => 
//      reverse0(2->3, 1) => 
//          reverse0(3, 2->1) => reverse0(null, 3->2->1)
// once the first argument is null, return the second arg
// which is nothing but the reveresed list.

Link reverse0(Link f, Link n) {
    if (f != null) {
        Link t = new Link(f.data1, f.data2); 
        t.nextLink = n;                      
        f = f.nextLink;             // assuming first had n elements before, 
                                    // now it has (n-1) elements
        reverse0(f, t);
    }
    return n;
}

7

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คำตอบส่วนใหญ่ไม่ใช่การเรียกซ้ำแบบหางกล่าวคือพวกเขาดำเนินการบางอย่างหลังจากกลับจากการโทรซ้ำและด้วยเหตุนี้จึงไม่ได้ผลที่สุด

นี่คือรุ่นหางซ้ำ:

public Node reverse(Node previous, Node current) {
    if(previous == null)
        return null;
    if(previous.equals(head))
        previous.setNext(null);
    if(current == null) {    // end of list
        head = previous;
        return head;
    } else {
                    Node temp = current.getNext();
        current.setNext(previous);
        reverse(current, temp);
    }
    return null;    //should never reach here.
} 

โทรด้วย:

Node newHead = reverse(head, head.getNext());

9
คุณอ้างอิงตัวแปรที่เรียกว่า "head" ในเมธอดของคุณ แต่ไม่มีการประกาศใด ๆ
มาราธอน

อาจเป็นวิธีการในคลาส List ที่มีแอตทริบิวต์ Node head
ChrisMcJava

4
โมฆะย้อนกลับ (node1, node2) {
ถ้า (node1.next! = null)
      ย้อนกลับ (node1.next, node1);
   node1.next = node2;
}
เรียกวิธีนี้ว่า reverse (start, null);

4
public Node reverseListRecursive(Node curr)
{
    if(curr == null){//Base case
        return head;
    }
    else{
        (reverseListRecursive(curr.next)).next = (curr);
    }
    return curr;
}

3
public void reverse() {
    head = reverseNodes(null, head);
}

private Node reverseNodes(Node prevNode, Node currentNode) {
    if (currentNode == null)
        return prevNode;
    Node nextNode = currentNode.next;
    currentNode.next = prevNode;
    return reverseNodes(currentNode, nextNode);
}

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุด ... การเรียกซ้ำหางง่าย ๆ ปรับให้เหมาะสมและตรวจสอบโมฆะเพียงครั้งเดียว
sdanzig

2
public static ListNode recRev(ListNode curr){

    if(curr.next == null){
        return curr;
    }
    ListNode head = recRev(curr.next);
    curr.next.next = curr;
    curr.next = null;

    // propogate the head value
    return head;

}

นี่เป็นทางออกที่ดีที่สุด แต่ไม่ใช่คำตอบที่ดีที่สุดเนื่องจากไม่มีคำอธิบายให้ :) ฉันได้รับโซลูชันที่คล้ายกันในตอนแรก แต่สูญเสียการอ้างอิงส่วนหัว วิธีนี้แก้ปัญหานั้นได้
OpenUserX03

2

ย้อนกลับโดยการเรียกซ้ำ algo

public ListNode reverse(ListNode head) {
    if (head == null || head.next == null) return head;    
    ListNode rHead = reverse(head.next);
    rHead.next = head;
    head = null;
    return rHead;
}

โดยการทำซ้ำ

public ListNode reverse(ListNode head) {
    if (head == null || head.next == null) return head;    
    ListNode prev = null;
    ListNode cur = head
    ListNode next = head.next;
    while (next != null) {
        cur.next = prev;
        prev = cur;
        cur = next;
        next = next.next;
    }
    return cur;
}

โชคไม่ดีที่การย้อนกลับซ้ำของคุณผิด !!
Sree Aurovindh

@SreeAurovindh - ทำไม?
rayryeng

2

โซลูชันนี้แสดงให้เห็นว่าไม่จำเป็นต้องมีข้อโต้แย้ง

/**
 * Reverse the list
 * @return reference to the new list head
 */
public LinkNode reverse() {
    if (next == null) {
        return this; // Return the old tail of the list as the new head
    }
    LinkNode oldTail = next.reverse(); // Recurse to find the old tail
    next.next = this; // The old next node now points back to this node
    next = null; // Make sure old head has no next
    return oldTail; // Return the old tail all the way back to the top
}

นี่คือรหัสสนับสนุนเพื่อแสดงให้เห็นว่าใช้งานได้:

public class LinkNode {
    private char name;
    private LinkNode next;

    /**
     * Return a linked list of nodes, whose names are characters from the given string
     * @param str node names
     */
    public LinkNode(String str) {
        if ((str == null) || (str.length() == 0)) {
            throw new IllegalArgumentException("LinkNode constructor arg: " + str);
        }
        name = str.charAt(0);
        if (str.length() > 1) {
            next = new LinkNode(str.substring(1));
        }
    }

    public String toString() {
        return name + ((next == null) ? "" : next.toString());
    }

    public static void main(String[] args) {
        LinkNode head = new LinkNode("abc");
        System.out.println(head);
        System.out.println(head.reverse());
    }
}

2

นี่คือวิธีการทำซ้ำง่ายๆ:

public static Node reverse(Node root) {
    if (root == null || root.next == null) {
        return root;
    }

    Node curr, prev, next;
    curr = root; prev = next = null;
    while (curr != null) {
        next = curr.next;
        curr.next = prev;

        prev = curr;
        curr = next;
    }
    return prev;
}

และนี่คือวิธีการเรียกซ้ำ:

public static Node reverseR(Node node) {
    if (node == null || node.next == null) {
        return node;
    }

    Node next = node.next;
    node.next = null;

    Node remaining = reverseR(next);
    next.next = node;
    return remaining;
}

1

เนื่องจาก Java เป็นแบบ pass-by-value เสมอในการย้อนกลับรายการที่เชื่อมโยงซ้ำใน Java ตรวจสอบให้แน่ใจว่าได้ส่งคืน "new head" (โหนดส่วนหัวหลังจากการย้อนกลับ) ในตอนท้ายของการเรียกซ้ำ

static ListNode reverseR(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode first = head;
    ListNode rest = head.next;

    // reverse the rest of the list recursively
    head = reverseR(rest);

    // fix the first node after recursion
    first.next.next = first;
    first.next = null;

    return head;
}

1

PointZeroTwo มีคำตอบที่สวยงามและเหมือนกันใน Java ...

public void reverseList(){
    if(head!=null){
        head = reverseListNodes(null , head);
    }
}

private Node reverseListNodes(Node parent , Node child ){
    Node next = child.next;
    child.next = parent;
    return (next==null)?child:reverseListNodes(child, next);
}

นี่เป็นสิ่งที่สมบูรณ์แบบเพราะคุณไม่ต้องการให้วิธีการรายการนั้นใช้รายการเป็นอาร์กิวเมนต์เสมอไป แต่กลับกันด้วยลูกของมันเองขอบคุณ
มนู

0
public class Singlelinkedlist {
  public static void main(String[] args) {
    Elem list  = new Elem();
    Reverse(list); //list is populate some  where or some how
  }

  //this  is the part you should be concerned with the function/Method has only 3 lines

  public static void Reverse(Elem e){
    if (e!=null)
      if(e.next !=null )
        Reverse(e.next);
    //System.out.println(e.data);
  }
}

class Elem {
  public Elem next;    // Link to next element in the list.
  public String data;  // Reference to the data.
}

0
public Node reverseRec(Node prev, Node curr) {
    if (curr == null) return null;  

    if (curr.next == null) {
        curr.next = prev;
        return curr;

    } else {
        Node temp = curr.next; 
        curr.next = prev;
        return reverseRec(curr, temp);
    }               
}

เรียกโดยใช้: head = reverseRec (null, head);


0

สิ่งที่คนอื่นทำในโพสต์อื่นคือเกมของเนื้อหาสิ่งที่ฉันทำคือเกมลิงค์ลิสต์มันย้อนกลับสมาชิกของ LinkedList ที่ไม่ย้อนกลับของมูลค่าของสมาชิก

Public LinkedList reverse(LinkedList List)
{
       if(List == null)
               return null;
       if(List.next() == null)
              return List;
       LinkedList temp = this.reverse( List.next() );
       return temp.setNext( List );
}

ฉันลืมไปว่าคุณต้องการวิธีการช่วยเหลือเพื่อตั้งค่าหางถัดไปด้วยค่า null
Nima Ghaedsharafi

0
package com.mypackage;
class list{

    node first;    
    node last;

    list(){
    first=null;
    last=null;
}

/*returns true if first is null*/
public boolean isEmpty(){
    return first==null;
}
/*Method for insertion*/

public void insert(int value){

    if(isEmpty()){
        first=last=new node(value);
        last.next=null;
    }
    else{
        node temp=new node(value);
        last.next=temp;
        last=temp;
        last.next=null;
    }

}
/*simple traversal from beginning*/
public void traverse(){
    node t=first;
    while(!isEmpty() && t!=null){
        t.printval();
        t= t.next;
    }
}
/*static method for creating a reversed linked list*/
public static void reverse(node n,list l1){

    if(n.next!=null)
        reverse(n.next,l1);/*will traverse to the very end*/
    l1.insert(n.value);/*every stack frame will do insertion now*/

}
/*private inner class node*/
private class node{
    int value;
    node next;
    node(int value){
        this.value=value;
    }
    void printval(){
        System.out.print(value+" ");
    }
}

 }

0

วิธีแก้ปัญหาคือ:

package basic;

import custom.ds.nodes.Node;

public class RevLinkedList {

private static Node<Integer> first = null;

public static void main(String[] args) {
    Node<Integer> f = new Node<Integer>();
    Node<Integer> s = new Node<Integer>();
    Node<Integer> t = new Node<Integer>();
    Node<Integer> fo = new Node<Integer>();
    f.setNext(s);
    s.setNext(t);
    t.setNext(fo);
    fo.setNext(null);

    f.setItem(1);
    s.setItem(2);
    t.setItem(3);
    fo.setItem(4);
    Node<Integer> curr = f;
    display(curr);
    revLL(null, f);
    display(first);
}

public static void display(Node<Integer> curr) {
    while (curr.getNext() != null) {
        System.out.println(curr.getItem());
        System.out.println(curr.getNext());
        curr = curr.getNext();
    }
}

public static void revLL(Node<Integer> pn, Node<Integer> cn) {
    while (cn.getNext() != null) {
        revLL(cn, cn.getNext());
        break;
    }
    if (cn.getNext() == null) {
        first = cn;
    }
    cn.setNext(pn);
}

}


0
static void reverseList(){

if(head!=null||head.next!=null){
ListNode tail=head;//head points to tail


ListNode Second=head.next;
ListNode Third=Second.next;
tail.next=null;//tail previous head is poiniting null
Second.next=tail;
ListNode current=Third;
ListNode prev=Second;
if(Third.next!=null){



    while(current!=null){
    ListNode    next=current.next;
        current.next=prev;
        prev=current;
        current=next;
    }
    }
head=prev;//new head
}
}
class ListNode{
    public int data;
    public ListNode next;
    public int getData() {
        return data;
    }

    public ListNode(int data) {
        super();
        this.data = data;
        this.next=null;
    }

    public ListNode(int data, ListNode next) {
        super();
        this.data = data;
        this.next = next;
    }

    public void setData(int data) {
        this.data = data;
    }
    public ListNode getNext() {
        return next;
    }
    public void setNext(ListNode next) {
        this.next = next;
    }





}

0
private Node ReverseList(Node current, Node previous)
    {
        if (current == null) return null;
        Node originalNext = current.next;
        current.next = previous;
        if (originalNext == null) return current;
        return ReverseList(originalNext, current);
    }

เริ่มต้นด้วย ReverseList (head, null)
pat

0
//this function reverses the linked list
public Node reverseList(Node p) {
    if(head == null){
        return null;
    }
    //make the last node as head
    if(p.next == null){
        head.next = null;
        head = p;
        return p;
    }
    //traverse to the last node, then reverse the pointers by assigning the 2nd last node to last node and so on..
    return reverseList(p.next).next = p;
}

0
//Recursive solution
class SLL
{
   int data;
   SLL next;
}

SLL reverse(SLL head)
{
  //base case - 0 or 1 elements
  if(head == null || head.next == null) return head;

  SLL temp = reverse(head.next);
  head.next.next = head;
  head.next = null;
  return temp;
}

0

แรงบันดาลใจจากบทความที่กล่าวถึงการนำโครงสร้างข้อมูลแบบเรียกซ้ำมาใช้ไม่ได้ฉันจึงนำโซลูชันอื่นมาใช้ร่วมกันโดยใช้ Swift

โซลูชันเอกสารคำตอบชั้นนำโดยเน้นหัวข้อต่อไปนี้:

  1. การกลับกันของศูนย์ (รายการว่าง) คืออะไร?
    • ไม่สำคัญที่นี่เพราะเรามีการป้องกันศูนย์ใน Swift
  2. อะไรคือสิ่งที่ย้อนกลับของรายการองค์ประกอบหนึ่ง?
    • องค์ประกอบนั้นเอง
  3. สิ่งที่ตรงกันข้ามของรายการองค์ประกอบ n คืออะไร?
    • การย้อนกลับขององค์ประกอบที่สองตามด้วยองค์ประกอบแรก

ฉันได้เรียกสิ่งเหล่านี้ออกไปหากสามารถทำได้ในโซลูชันด้านล่าง

/**
 Node is a class that stores an arbitrary value of generic type T 
 and a pointer to another Node of the same time.  This is a recursive 
 data structure representative of a member of a unidirectional linked
 list.
 */
public class Node<T> {
    public let value: T
    public let next: Node<T>?

    public init(value: T, next: Node<T>?) {
        self.value = value
        self.next = next
    }

    public func reversedList() -> Node<T> {
        if let next = self.next {
            // 3. The reverse of the second element on followed by the first element.
            return next.reversedList() + value
        } else {
            // 2. Reverse of a one element list is itself
            return self
        }
    }
}

/**
 @return Returns a newly created Node consisting of the lhs list appended with rhs value.
 */
public func +<T>(lhs: Node<T>, rhs: T) -> Node<T> {
    let tail: Node<T>?
    if let next = lhs.next {
        // The new tail is created recursively, as long as there is a next node.
        tail = next + rhs
    } else {
        // If there is not a next node, create a new tail node to append
        tail = Node<T>(value: rhs, next: nil)
    }
    // Return a newly created Node consisting of the lhs list appended with rhs value.
    return Node<T>(value: lhs.value, next: tail)
}

0

การย้อนกลับรายการที่เชื่อมโยงโดยใช้การเรียกซ้ำ แนวคิดนี้กำลังปรับการเชื่อมโยงโดยการย้อนกลับลิงก์

  public ListNode reverseR(ListNode p) {

       //Base condition, Once you reach the last node,return p                                           
        if (p == null || p.next == null) { 
            return p;
        }
       //Go on making the recursive call till reach the last node,now head points to the last node

        ListNode head  = reverseR(p.next);  //Head points to the last node

       //Here, p points to the last but one node(previous node),  q points to the last   node. Then next next step is to adjust the links
        ListNode q = p.next; 

       //Last node link points to the P (last but one node)
        q.next = p; 
       //Set the last but node (previous node) next to null
        p.next = null; 
        return head; //Head points to the last node
    }

1
โปรดอธิบายเพิ่มเติมเกี่ยวกับคำตอบของคุณโดยเพิ่มคำอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับโซลูชันที่คุณให้มาได้ไหม
หอยเป๋าฮื้อ

1
ฉันเพิ่มความคิดเห็น ขอบคุณมาก
gurubelli


-1
public void reverse(){
    if(isEmpty()){
    return;
     }
     Node<T> revHead = new Node<T>();
     this.reverse(head.next, revHead);
     this.head = revHead;
}

private Node<T> reverse(Node<T> node, Node<T> revHead){
    if(node.next == null){
       revHead.next = node;
       return node;
     }
     Node<T> reverse = this.reverse(node.next, revHead);
     reverse.next = node;
     node.next = null;
     return node;
}

-1

นี่คือข้อมูลอ้างอิงหากมีคนกำลังมองหาการใช้งาน Scala:

scala> import scala.collection.mutable.LinkedList
import scala.collection.mutable.LinkedList

scala> def reverseLinkedList[A](ll: LinkedList[A]): LinkedList[A] =
         ll.foldLeft(LinkedList.empty[A])((accumulator, nextElement) => nextElement +: accumulator)
reverseLinkedList: [A](ll: scala.collection.mutable.LinkedList[A])scala.collection.mutable.LinkedList[A]

scala> reverseLinkedList(LinkedList("a", "b", "c"))
res0: scala.collection.mutable.LinkedList[java.lang.String] = LinkedList(c, b, a)

scala> reverseLinkedList(LinkedList("1", "2", "3"))
res1: scala.collection.mutable.LinkedList[java.lang.String] = LinkedList(3, 2, 1)

ฉันยินดีเป็นอย่างยิ่งที่จะปรับปรุงคำตอบของฉันหากบุคคลที่ถูกโหวตให้คำอธิบายกับฉันเกี่ยวกับการกระทำของเขา อย่างไรก็ตามมันยังใช้ได้กับฉันใน Scala :)
Venkat Sudheer Reddy Aedama

เพียงเพื่อให้ผู้ลงคะแนนทราบว่านี่เป็นวิธีการแก้ปัญหาแบบวนซ้ำ (อันที่จริงหางซ้ำ)
Venkat Sudheer Reddy Aedama

Scala ไม่ใช่ Java แม้ว่าทั้งคู่จะทำงานบน JVM ก็ตาม
Bill Lynch

@sharth ว้าวดีที่ได้รู้ คุณรบกวนที่จะอ่านบรรทัดแรกในคำตอบของฉันหรือไม่?
Venkat Sudheer Reddy Aedama

@VenkatSudheerReddyAedama คุณได้รับการโหวตให้ลดลงเนื่องจากคำถามเดิมกำลังขอให้นำไปใช้งานใน Java แม้ว่า Scala จะทำงานใน JVM แต่สิ่งนี้ไม่ได้ช่วยในการตอบคำถาม ... แม้ว่าจะค่อนข้างสง่างาม FWIW ฉันไม่ได้ลงคะแนนให้คุณ
rayryeng
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.