Как добавить метод отображения в реализацию Java Linked List, который отображает только первые и последние 10 элементов в списке? - PullRequest
1 голос
/ 06 марта 2012

ОБНОВЛЕНИЕ: Спасибо всем, кто ответил, я сделал то, что мне было поручено. Это действительно отличный форум, и я был удивлен, найдя здесь столько полезных и дружелюбных людей:)

Я изменил метод print следующим образом:

public static void print(ListNode start){

            System.out.println("Printing the first 10 elements on the list:");
            System.out.print("{");

            ListNode previous = start;
            ListNode current = start;

            for (int i = 0; i<10; i++){
                current=current.next;
            }


            for(ListNode node = start; node != current; node = node.next){
                System.out.print(node);
            }
            System.out.println("}");

            System.out.println("Printing the last 10 elements on the list:");
            System.out.print("{");

            while(current != null){
                previous = previous.next;
                current = current.next;
                }

            for(ListNode node = previous; node != current; node = node.next){
                System.out.print(node);
            }

            System.out.println("}");
            System.out.println("End of list");
       }    

КОНЕЦ ОБНОВЛЕНИЯ


Я изучаю алгоритмы и структуры данных в Java, и мне нужно добавить определенный метод отображения в существующую реализацию Linked List упражнения, но я не знаю, как это сделать.

Таким образом, есть связанный список, который содержит много элементов (скажем, тысяч), и Мне нужен метод отображения, который показывает только первые и последние 10 элементов в списке.

Можете ли вы предложить мне способ сделать это?

Реализация связанного списка, над которой мне нужно поработать, выглядит следующим образом:

import java.util.*;
public class Main {
    public static class ListNode {
      //A linked list node. The data field is represented by the field int data
        //The next item is referenced by the reverence value next

        int data;
        ListNode next;
        public ListNode(){
             this.data = 0; this.next = null;
        }
        public ListNode(int data){
            this();this.data = data;
        }
        public ListNode(int data, ListNode next){
             this.data = data;this.next = next;
        }
        public String toString()    {
             return "[" + this.data + "]";
        }
        //The linked list is referenced by the first node.
        //An empty list is referenced by a null reference.
        //That's why all methods for the list are public static -
        //(null doesn't have methods)

        //Returns the beginning of a list with length "length"and 
        //elements with random values
        public static ListNode generate(int length) {
            ListNode start = null;
            Random rn = new Random();
            for(int i = 0; i < length; i++){
                start = new ListNode(rn.nextInt(10000), start);
            }
            return start;
        }

        //Displays the list to the console from the specified starting point
        public static void print(ListNode start){
            System.out.print("{");
            for(ListNode node = start; node != null; node = node.next){
                System.out.print(node);
            }
            System.out.println("}");
        }

        //Counts how many elements there are in the list
        public static int length(ListNode L){
            int k=0;
            for(;L!=null;k++,L=L.next);
            return k;
        }

        //Returns a node with key searchd if found in the list 
        public static ListNode search(ListNode start, int searchd){
            for(ListNode node = start; node != null; node = node.next){
                if(node.data == searchd){ return node; }
            }
            return null;
        }

        //If a node with the specified key is found in the list L 
        //a new node with the value keyAfter is inserted after it.
        public static void insertAfter(ListNode L, int key, int keyAfter){
            while(L!=null && L.data!=key)L=L.next;
            if(L!=null){
                L.next= new ListNode(keyAfter,L.next);
            }
        }

        //Inserts a node with key "keyBefore" before the node
        //with the specified key

        public static ListNode insertBefore(ListNode L, int key, int keyBefore){
            ListNode p = null, r=L;
            while(L!=null && L.data!=key){
                p=L;L=L.next;
            }
            if(p!=null){
                p.next= new ListNode(keyBefore,p.next);return r;
            }
            else{
                p=new ListNode(keyBefore,L);return p;
            }
        }

        //Inserts a new element with the specified key in a sorted list 
        //with ascending values so that the list remains sorted

        public static ListNode insertOrd(ListNode L, int key){
            ListNode p = null, r=L;
            while(L!=null && L.data<key){
                p=L;L=L.next;
            }
            if(p!=null){
                p.next= new ListNode(key,p.next);return r;
            }
            else{
                p=new ListNode(key,L);return p;
            }
        }

        //Generates a sorted list with a specified lenght
        public static ListNode generateOrd(int length) {
            ListNode start = null;
            Random rn = new Random();
            for(int i = 0; i < length; i++){
                start = insertOrd(start,rn.nextInt(10000));
            }
            return start;
        }

         //Takes two ordered lists and returns a merged and sorted list 
        //that combines the  elements in the original lists

          public static ListNode merge(ListNode a, ListNode b){
            if(a==null)return b;
            if(b==null)return a;
            ListNode r = null;
            if(a.data<=b.data){
                r=a;a=a.next;
            }else{
                r=b;b=b.next;
            }
            ListNode last=r;
            while(a!=null && b!=null){
                if(a.data<=b.data){
                    last.next=a;a=a.next;
                }else{
                    last.next=b;b=b.next;
                }
                last=last.next;
            }
            if(a!=null)last.next=a;else last.next=b;    
            return r;
        }

        //Splits a list evenly and returns the beginning of the 2-nd part

       public static ListNode split(ListNode L){
            int n=length(L)/2;
            ListNode t=L;
            for(int i=0;i<n-1;i++,t=t.next);
            ListNode secPart = t.next;
            t.next=null;
            return secPart;
        }

        //Sorts a list in an ascending order
        public static ListNode mrgSort(ListNode L){
            if(L==null || L.next==null)return L;
            ListNode b = split(L);
            L=mrgSort(L); b= mrgSort(b);
            return merge(L,b);
        }
    };//End of class ListNode

    public static void main(String[] args){

            ListNode a = ListNode.generateOrd(10);
        ListNode.print(a);
            ListNode b = ListNode.generateOrd(10);
        ListNode.print(b);
        a=ListNode.merge(a,b);
        ListNode.print(a);
        b=ListNode.split(a);
        ListNode.print(a);
        ListNode.print(b);
        ListNode c = ListNode.generate(20);
        ListNode.print(c);
        c = ListNode.mrgSort(c);
        ListNode.print(c);
    }

}

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Это довольно странная реализация связанного списка.

То, что торчит, это

  • Количество статических членов
  • Нет класса, представляющего фактический список.

Статические члены в узле должны быть помещены в класс LinkedList. Ознакомьтесь с членами класса JavaAPI LinkedList .

Другие члены аналогичны тем, которые можно найти в классе Collections .

В его нынешнем виде самое простое решение, как peraueb предлагает в комментариях следовать методу печати; То есть делайте так, как печатает, и сохраняйте ссылку на 10-й до последнего узла. Идея noMAD будет хорошо работать там.

Обычный способ сделать это состоит в том, чтобы класс LinkedList обрабатывал ссылки / ссылки на первый и последний узел. Сам узел должен содержать ссылки / ссылки на предыдущий , а также на узел next . Это предложение Nactives ответа. Теперь вы вручную имеете дело с теми, кто в основном (...).

2 голосов
/ 06 марта 2012

Хорошо, я не собираюсь писать код для вас, но плохо расскажу вам, как это сделать.

Сначала скажите, что у вас есть два указателя (head1 and head2), которые указывают на первый узел list. Двигайтесь head2 на десять шагов вперед, удерживая head1 в том же месте.

Теперь, после десяти шагов у вас есть head1 в 0 и head2 в 9-й позиции. Теперь двигайтесь вместе, пока head2 не достигнет NULL. Как только head2 достигнет NULL, начните двигаться только head1 и печатайте каждый узел, пока head1 не достигнет head2.

Надеюсь, это поможет

1 голос
/ 06 марта 2012

Для этого вам понадобится ссылка на ваш первый и последний элемент.

Лучшим способом является также создание двойного связанного списка: http://en.wikipedia.org/wiki/Doubly_linked_list

По сути, в начале вашего списка он все тот же. Но теперь вы также можете получить доступ к списку в конце и перейти к началу списка.

...