【问题标题】:Reverse LinkList whilst preserving original nodes反向链表,同时保留原始节点
【发布时间】:2018-10-08 19:47:53
【问题描述】:

我的老师分配了一个程序来创建一些随机数的链表。我将从列表中创建它,然后任务的第二部分是反转它。实际报价是

编写一个名为 reverseLinkedList() 的 Java 方法,该方法将生成一个 从您在问题中创建的链表中反转链表 1. 你的方法应该接受一个链表作为输入并返回另一个链表,它的节点引用反向 命令。请不要反向打印原始列表。这个想法是 操作节点引用,以便将节点保留在 它们的顺序与最初创建的顺序相同。

到目前为止我生成的代码看起来像

import java.util.*;

public class progassignment2 
{ 
    public static void main(String args[]) 
    { 
        List<Integer> myList = new ArrayList<Integer>();
        Random ran = new Random();
        int ranNum;
        for(int x = 0;x<5;x++)
        {
            ranNum =  ran.nextInt(500);
            myList.add(x,ranNum);
        }
        LinkedList<Integer> mylinklist = createLinkedList(myList);
        System.out.println(mylinklist);
        LinkedList<Integer> mylinklistrev = reverseLinkedList(mylinklist);
    } 

    public static LinkedList createLinkedList(List<Integer> integerList)
    {
        LinkedList<Integer> linkedlist = new LinkedList<Integer>();
        linkedlist.addAll(integerList);
        return linkedlist;
    }

    public static LinkedList reverseLinkedList(LinkedList inputList)
    {
        for(int y = 0;y < inputList.size();y++)
        {
            inputList.addLast(inputList.pollFirst());
        }
        return inputList;
    }
 }

但是我认为我没有正确完成作业,或者我理解他的要求,很遗憾不会回答任何问题,只是引用“阅读作业”。非常感谢任何帮助

【问题讨论】:

  • 鉴于问题中的低级细节(即明确引用节点),我非常怀疑您应该使用java.util.LinkedList,而是实现您自己的链表。取决于它是单链接还是双链接会影响您从原始链接创建反向链接列表的方式...
  • 你在问题​​ 1 中创建的链表是什么?仔细阅读作业以理解它。就像@d.j.brown 所说,我认为您不应该使用java.util.LinkedList,而是您自己的链接列表实现,我假设您在问题 1 中创建。
  • 是的,你可能是对的,作业页面没有注明:/

标签: java list linked-list


【解决方案1】:

怎么样:

public static LinkedList reverseLinkedList(List<Integer> inputList) {
    LinkedList<Integer> reversedLinkedlist = new LinkedList<Integer>(inputList);
    Collections.reverse(reversedLinkedlist);
    return reversedLinkedlist;
}

【讨论】:

  • 我们在课程作业中没有检查收藏,所以我不确定他是否会接受。
  • @RyanJohnTyler 所以任务是在不使用集合的情况下改变集合?
  • 他只是想让我们反转一个反向的LinkedList,但是当他说The idea is to manipulate the node references so that the nodes are preserved in same in order as they were originally created.我不确定他是否只是想让我反转指针?
  • @RyanJohnTyler 那么建议的解决方案有什么问题?初始列表保持原样。新的节点是使用相反的节点顺序创建的。节点引用在Collections 的帮助下进行操作。它没有按预期工作吗?
  • 我们只是还没有在课程作业中检查收藏,我认为他不会接受。不过我非常愿意尝试
【解决方案2】:

通常,链表练习不使用任何内置的 Java 集合(如 ArrayList、LinkedList 等),而是让您构建自己的集合类型。

您的老师可能希望您构建一个非常基本的元素,然后它将成为您自己的集合类型的构建块:想象一个对象,您可以在其中存储一个值和对列表中以下值的引用。在代码中:

class Node {
    private int value;
    private Node next;

    public Node(int value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }

    public Node getNext(){
        return next;
    }

    public void setNext(Node next){
        this.next = next;
    }
}

每个元素都指向下一个元素,链表的末尾以最后一个节点的下一个元素为null标记。

通过使用这样的对象,您将能够定义自己的链表,而无需使用 Java 提供的任何预定义集合。

您肯定听说过stack 数据结构:通过读取链表中的所有元素并将它们放入堆栈中,一旦列表结束,您将获取堆栈中的元素;按照从堆栈中拉出的元素的顺序创建链表将解决您反转链表的问题。

【讨论】:

    【解决方案3】:

    这个想法是操纵节点引用,以便节点是 以与它们最初创建时相同的顺序保存。

    您应该创建自己的 LinkedList。不允许使用常见的逆向方法,例如使用递归、堆栈、修改或任何集合接口方法。

    这里是link包括LinkedList的反转方式和解决方案:

    class LinkedList {
        Node head; // head of list
        /* Linked list Node */
    
        class Node {
            int data;
            Node next;
    
            Node(int d) {
                data = d;
                next = null;
            }
        }
    
        /* Function to print reverse of linked list */
        void printReverse(Node head) {
            if (head == null)
                return;
            // print list of head node
            printReverse(head.next);
    
            // After everything else is printed
            System.out.print(head.data + " ");
        }
    
        /* Inserts a new Node at front of the list. */
        public void push(int new_data) {
            Node new_node = new Node(new_data);
    
            new_node.next = head;
    
            head = new_node;
        }
    
        public static void main(String args[]) {
            LinkedList llist = new LinkedList();
            llist.push(4);
            llist.push(3);
            llist.push(2);
            llist.push(1);
    
            llist.printReverse(llist.head);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2010-09-18
      • 2013-09-05
      相关资源
      最近更新 更多