简体   繁体   中英

Reverse singly linked list

I have the below program to reverse elements in a singly linked list. I can't get it to work. I have used simple swapping of variables technique to swap the nodes but when I print, it doesn't go beyond the first node.

public static void reverseLinkedList(Node head) {
    Node current = head;
    Node temp = null;
    while (current != null && current.next != null) {
        temp = current;
        current = current.next;
        current.next = temp;
    }
}
public static void printData(Node head) {
    Node currentNode = head;
    while (true) {
        System.out.println(currentNode.data);
        if (currentNode.next != null) {
            currentNode = currentNode.next;
        } else {
            break;
        }
    }
}

I prefer to return the head node after the function. Keeps thing simple

Node reverse(Node node) 
{ 
    Node prev = null; 
    Node current = node; 
    Node next = null; 
    while (current != null) { 
        next = current.next; 
        current.next = prev; 
        prev = current; 
        current = next; 
    } 
    node = prev; 
    return node; 
} 

Alternatively you can opt for the simpler recursive version

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

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

    Node newHeadNode = reverse(head.next); 

    head.next.next = head; 
    head.next = null; 
    return newHeadNode; 
} 

You are assigning the next of the current variable to itself which is wrong. You can do like below.

public void reverseLL(Node head) {
Node currentNode = head, prevLink = null, nextNode = null;

while (currentNode != null) {
    nextNode = currentNode.next;
    currentNode.next = prevLink;
    prevLink = currentNode;
    currentNode = nextNode;
}
head = prevLink;
}

In your algorithm the first two nodes of the list creates a loop after the first iteration of the while loop.It's better to use the below algorithm.

public static void reverseLinkedList(Node head) {
    Node current = head;
    Node prev = head;
    Node next = head.next;
    while (current != null && current.next != null) {
        current=next;
        next=current.next;
        current.next=prev;
        prev=current;
    }
   head=current;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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