无需实际反转链表的 JavaScript 打印反转链表程序


链表是线性数据结构,其内存并非连续的。我们将用 JavaScript 编写完整的代码,并提供不同的方法和示例来更好地理解这个过程。

问题介绍

在这个问题中,我们得到一个链表,我们必须以相反的顺序打印其所有元素,但我们不必反转给定的链表。

例如:

Given linked list: 1 2 3 4 5 6
Result: 6 5 4 3 2 1 

我们将使用两种方法以相反的方式打印给定的链表,让我们来看看它们:

存储在数组中

在这种方法中,我们将按照它们在链表中出现的顺序存储给定链表的元素,然后我们将以相反的顺序打印数组的元素,因为获取数组的索引很容易。

示例

由于数组是固定大小的,我们现在假设链表中的最大元素数为 1000,因此我们只创建此大小的数组。让我们看看代码:

<html>
<body>
   <script>
      // creating class for linked list 
      class Node {
         constructor(data){
            this.value = data
            this.next = null
         }
      }
      // function to print elements of the linked list 
      function print(head){
         var temp = head
         while(temp != null) {
            document.write(temp.value + " ")
            temp = temp.next
         }
      }
      // function to print the elements in an opposite manner 
      function reverse_LL(head) {
         var temp = head;
         // getting the size of the linked list 
         count = 0;
         while(temp != null){
            temp = temp.next
            count++;
         }
         var arr = new Array(count)
         temp = head;
         var i = 0
         while(temp != null){
            arr[i] = temp.value
            temp = temp.next
            i++
         }
         while(i--) {
            document.write(arr[i] + " ")
         }
      }
      // creating the linked list 
      var head = new Node(1)
      head.next = new Node(2)
      head.next.next = new Node(3)
      head.next.next.next = new Node(4)
      head.next.next.next.next = new Node(5)
      head.next.next.next.next.next = new Node(6)
      // printing the linked list 
      document.write("The linked list is: ")
      print(head)
      document.write("<br>The linked list in reverse order is: ")
      reverse_LL(head)
   </script>
</body>
</html>

时间和空间复杂度

上述代码的时间复杂度为 O(N),其中 N 是链表的大小。

上述代码的空间复杂度为 O(N),因为我们使用额外的数组来存储链表元素。

注意:在上面的代码中,我们没有将数组大小设置为 1000,而是首先遍历链表以查找其大小,然后创建该大小的数组。

使用递归

在上述方法中,我们首先找到链表的大小,然后使用数组存储元素,这使得代码看起来更长。为了克服这个问题,我们可以使用递归的概念,在这个概念中,我们将创建一个函数并将链表作为参数传递。

在递归函数中,我们将使用基准情况,即当前参数为空,否则我们首先调用下一个具有下一个节点作为参数的相同函数,然后调用后,我们将打印当前节点的值。

示例

这将以相反的方式打印链表的元素,而不会反转给定的链表,让我们看看代码:

<html>
<body>
   <script>
      // creating class for linked list 
      class Node{
         constructor(data){
            this.value = data
            this.next = null
         }
      }
      
      // function to print elements of the linked list 
      function print(head){
         var temp = head
         while(temp != null){
            document.write(temp.value + " ")
            temp = temp.next
         }
      }
      
      // function to print the elements in the oposite manner 
      function reverse_LL(head){
         if(head == null)    {
            return 
         }
         reverse_LL(head.next)
         document.write(head.value + " ")
      }
      
      // creating the linked list 
      var head = new Node(1)
      head.next = new Node(2)
      head.next.next = new Node(3)
      head.next.next.next = new Node(4)
      head.next.next.next.next = new Node(5)
      head.next.next.next.next.next = new Node(6) 
      
      // printing the linked list 
      document.write("The linked list is: ")
      print(head)
      document.write("<br>The linked list in reverse order is: ")
      reverse_LL(head)
   </script>
</body>
</html>

时间和空间复杂度

上述代码的时间复杂度为 O(N),其中 N 是链表的大小。

上述代码的空间复杂度为 O(N),这个因素是由于将包含递归调用元素的堆栈大小造成的。

结论

在本教程中,我们实现了一个 JavaScript 程序,用于打印给定链表的逆序,而无需反转给定的链表。在第一种方法中,我们将链表的所有元素添加到数组中并以相反的顺序打印。在第二种方法中,我们创建了一个递归函数,该函数将以相反的方式打印元素。两种方法的时间和空间复杂度均为 O(N)。

更新于:2023年4月14日

142 次浏览

启动您的 职业生涯

完成课程获得认证

开始学习
广告