how to reverse a list with O(1) space and O(n) time?

前端 未结 8 1577
梦毁少年i
梦毁少年i 2020-12-28 19:56

I am looking for a method that reverses the same instance of a given list, with O(1) additional space and O(n) time.
this is not HW nor I am looking for some library me

8条回答
  •  臣服心动
    2020-12-28 20:23

    Here is a solution in Java, with O(n) time complexity (just a single pass) and O(1) space complexity (Using just two temporary variables):

        private static void reverseLinkedList() {//O(n) Time complexity, O(1) space complexity 
    
        //two temp pointers
        Node next = null, previous = null;
    
        while(head.next != null){
            next = head.next;//move next to next address
            head.next = previous;   //previous node will be the next node for head, so that head will point reverse         
            previous = head; //incrementing previous to the current node
            head = next; //incrementing head 
    
        }
        //at this point head points to last node and previous has the remaining reversed array
        head.next = previous;
        System.out.println("\nReversed");
    
    }
    

    Full code goes like:

      package com.test;
    
    public class LinkedListReverse {
        private static Node  head;
        public static void main(String[] args) {
    
            for(int i = 0 ; i< 10 ; i++){
                addToLinkedList(i);
            }
            System.out.println("Added Data");
    
            printLinkedList();
            reverseLinkedList();
            printLinkedList();
    
    
        }
    
    
    
        private static void reverseLinkedList() {//O(n) Time complexity, O(1) space complexity 
    
            //two temp pointers
            Node next = null, previous = null;
    
            while(head.next != null){
                next = head.next;//move next to next address
                head.next = previous;   //previous node will be the next node for head, so that head will point reverse         
                previous = head; //incrementing previous to the current node
                head = next; //incrementing head 
    
            }
            //at this point head points to last node and previous has the remaining reversed array
            head.next = previous;
            System.out.println("\nReversed");
    
        }
    
    
        /* Logic for adding and printing linked list*/
        private static void printLinkedList() {
            System.out.println("Printing linked list");
            Node temp = head;
            while(temp.next != null){
                System.out.print(temp.value+" ");
                temp = temp.next;
            }
            System.out.print(temp.value+" ");//print the value at the last node
    
    
        }
    
        private static void addToLinkedList(int value){
            if(head == null){
                head = new Node(value, null);
            }else{
                Node temp = head;
                while(temp.next != null){
                    temp = temp.next;
                }
                temp.next = new  Node(value, null);
            }
        }
    
    }
    
    //Linked List definition 
    class Node{
        int value;
        Node next;
        public Node(int value, Node next){
            this.value = value;
            this.next = next;
        }
    }
    

    Program's Output:

    Added Data
    Printing linked list
    0 1 2 3 4 5 6 7 8 9 
    Reversed
    Printing linked list
    9 8 7 6 5 4 3 2 1 0 
    

    Hope it helps :)

提交回复
热议问题