Java 反转LinkedList

Java 反转LinkedList

假设你已经通过了java中的LinkedList并了解了链接列表。这篇文章包含了反转链接列表的不同例子,如下所示: 1. 通过编写我们自己的函数(使用额外的空间):reverseLinkedList()方法包含反转字符串对象的逻辑。 通过编写我们自己的函数(使用额外的空间): reverseLinkedList()方法包含在一个链接列表中反转字符串对象的逻辑。该方法以一个链表为参数,以相反的顺序遍历所有的元素,并将其添加到新创建的链表中。

算法: 步骤

1.创建一个有n个元素的链表
2.创建一个空的链表,它将被用来存储反转的元素
3.开始从’n’到’0’遍历列表,并将这些元素存储在新创建的列表中。
4.这些元素将按以下顺序存储:n,n-1,n-2,……0 步骤
5.将列表返回给调用者并打印出来
例子:
第1步: LL: 1 -> 2 -> 3 -> 4 -> 5 其中’LL’是有n个元素的链接列表
第2步: ‘Rev’是一个空链表。
第3步:开始遍历,下面的遍历是遍历时的中间步骤
第1步: Rev: 5
第2步: Rev: 5 -> 4
第3步: Rev: 5 -> 4 -> 3
第4步: Rev: 5->4->3->2
第5步: Rev: 5 -> 4 -> 3 -> 2 -> 1
第4步:‘LL’的第n个元素被存储在’Rev’的第0个位置。
LL的n-1个元素被存储在Rev的第1个位置,以此类推……。
第5步:返回Rev:5->4->3->2->1到调用函数。

// Java program for reversing linked list using additional space
import java.util.*;
 
public class LinkedListTest1 {
    public static void main(String[] args)
    {
        // Declaring linkedlist without any initial size
        LinkedList<String> linkedli = new LinkedList<String>();
        // Appending elements at the end of the list
        linkedli.add("Cherry");
        linkedli.add("Chennai");
        linkedli.add("Bullet");
        System.out.print("Elements before reversing: " + linkedli);
        linkedli = reverseLinkedList(linkedli);
        System.out.print("\nElements after reversing: " + linkedli);
    }
 
    // Takes a linkedlist as a parameter and returns a reversed linkedlist
    public static LinkedList<String> reverseLinkedList(LinkedList<String> llist)
    {
        LinkedList<String> revLinkedList = new LinkedList<String>();
        for (int i = llist.size() - 1; i >= 0; i--) {
 
            // Append the elements in reverse order
            revLinkedList.add(llist.get(i));
        }
        // Return the reversed arraylist
        return revLinkedList;
    }
}

时间复杂度: O(n) 空间复杂度: O(n) 注意: 由于我们使用额外的内存空间来存储所有反转的’n’元素,空间复杂度为O(n)。

输出

Elements before reversing: [Cherry, Chennai, Bullet]
Elements after reversing: [Bullet, Chennai, Cherry]

2.通过编写我们自己的函数(不使用额外的空间): 在前面的例子中,另外使用了一个链接列表来存储所有反转的元素,这需要更多的空间。为了避免这种情况,可以用同一个链表来进行反转。

算法:
1.创建一个有n个元素的链表 1.循环运行n/2次,其中’n’是链表中元素的数量。
2.在第一遍中,交换第一个和第n个元素
3.在第二遍中,交换第二个和第(n-1)个元素,以此类推,直到你到达链接列表的中间。
4.循环结束后返回链接列表。

示例:
输入: 1 -> 2 -> 3 -> 4 -> 5
1st pass: (swap first and nth element)
5 -> 2 -> 3 -> 4 -> 1
2nd pass: (swap second and (n-1)th element)
5 -> 4 -> 3 -> 2 -> 1
3rd pass: (reached mid, Terminate loop)
5 -> 4 -> 3 -> 2 -> 1
输出: 5 -> 4 -> 3 -> 2 -> 1

// Java program for reversing an arraylist without
// using any additional space
import java.util.*;
 
public class LinkedListTest2 {
    public static void main(String[] args)
    {
        // Declaring linkedlist without any initial size
        LinkedList<Integer> linkedli = new LinkedList<Integer>();
 
        // Appending elements at the end of the list
        linkedli.add(new Integer(1));
        linkedli.add(new Integer(2));
        linkedli.add(new Integer(3));
        linkedli.add(new Integer(4));
        linkedli.add(new Integer(5));
        System.out.print("Elements before reversing: " + linkedli);
 
        // Calling user defined function for reversing
        linkedli = reverseLinkedList(linkedli);
        System.out.print("\nElements after reversing: " + linkedli);
    }
 
    // Takes a linkedlist as a parameter and returns a reversed linkedlist
    public static LinkedList<Integer> reverseLinkedList(LinkedList<Integer> llist)
    {
        for (int i = 0; i < llist.size() / 2; i++) {
            Integer temp = llist.get(i);
            llist.set(i, llist.get(llist.size() - i - 1));
            llist.set(llist.size() - i - 1, temp);
        }
 
        // Return the reversed arraylist
        return llist;
    }
}

时间复杂度: O(n/2) 空间复杂度: O(1)

输出

Elements before reversing: [1, 2, 3, 4, 5]
Elements after reversing: [5, 4, 3, 2, 1]

3.通过使用Collections类: Collections是java.util包中的一个类,它包含各种静态方法,用于搜索、排序、反转、查找最大值、min….等。我们可以利用内置的Collections.reverse()方法来反转一个链接列表。它接收一个列表作为输入参数,并返回反转的列表。

注意:Collections.reverse()方法使用的算法与 “通过编写我们自己的函数(不使用额外的空间)相同

// Java program for reversing a linked list using
// In-built collections class
import java.util.*;
 
public class LinkedListTest3 {
    public static void main(String[] args)
    {
        // Declaring linkedlist without any initial size
        LinkedList<Integer> linkedli = new LinkedList<Integer>();
 
        // Appending elements at the end of the list
        linkedli.add(new Integer(1));
        linkedli.add(new Integer(2));
        linkedli.add(new Integer(3));
        linkedli.add(new Integer(4));
        linkedli.add(new Integer(5));
        System.out.print("Elements before reversing: " + linkedli);
 
        // Collections.reverse method takes a list as a
        // parameter and returns the reversed list
        Collections.reverse(linkedli);
 
        System.out.print("\nElements after reversing: " + linkedli);
    }
}

时间复杂度: O(n/2) 空间复杂度: O(1)

输出

Elements before reversing: [1, 2, 3, 4, 5]
Elements after reversing: [5, 4, 3, 2, 1]

4.反转用户定义对象的链接列表: 创建一个Employee类,用于创建用户定义的对象,EmployeeID、EmployeeName、DepartmentName是类的变量,在构造函数中被初始化。创建一个链接列表,只接受Employee(用户定义)对象。这些对象通过add()方法被添加到链接列表中。printElements()方法被用来遍历链接列表中所有的用户定义对象,并打印每个对象的雇员ID、姓名和部门名称。

// Java program for reversing a linkedlist of user defined objects
import java.util.*;
 
class Employee {
    int empID;
    String empName;
    String deptName;
 
    // Constructor for initializing the class variables
    public Employee(int empID, String empName, String deptName)
    {
        this.empID = empID;
        this.empName = empName;
        this.deptName = deptName;
    }
}
 
public class LinkedListTest4 {
    public static void main(String[] args)
    {
        // Declaring linkedList without any initial size
        LinkedList<Employee> linkedli = new LinkedList<Employee>();
 
        // Creating user defined objects
        Employee emp1 = new Employee(123, "Cherry", "Fashionist");
        Employee emp2 = new Employee(124, "muppala", "Development");
        Employee emp3 = new Employee(125, "Bullet", "Police");
 
        // Appending all the objects to linkedList
        linkedli.add(emp1);
        linkedli.add(emp2);
        linkedli.add(emp3);
        System.out.print("Elements before reversing: ");
        printElements(linkedli);
 
        // Collections.reverse method takes a list as a parameter
        // and returns the reversed list
        Collections.reverse(linkedli);
 
        System.out.print("\nElements after reversing: ");
        printElements(linkedli);
    }
 
    // Iterate through all the elements and print
    public static void printElements(LinkedList<Employee> llist)
    {
        for (int i = 0; i < llist.size(); i++) {
            System.out.print("\n EmpID:" + llist.get(i).empID + ", EmpName:"
                             + llist.get(i).empName + ", Department:" + llist.get(i).deptName);
        }
    }
}

时间复杂度: O(n/2) 空间复杂度: O(1)

输出

Elements before reversing: 
 EmpID:123, EmpName:Cherry, Department:Fashionist
 EmpID:124, EmpName:muppala, Department:Development
 EmpID:125, EmpName:Bullet, Department:Police
Elements after reversing: 
 EmpID:125, EmpName:Bullet, Department:Police
 EmpID:124, EmpName:muppala, Department:Development
 EmpID:123, EmpName:Cherry, Department:Fashionist

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程