Кръгов свързан списък с размер K

Имам въпрос относно създаването на единичен Circular Linked List без метод за добавяне. Само вътрешен клас на Node и след това конструктор отвън с toString метод.
Трудно ми е returning List, непрекъснато не връщам нищо. и не знам защо, защото не мога да внедря метод за добавяне. Трябва да създам кръгъл свързан списък в моя конструктор, така че това ми дава малко представа за него. Но как да присвоя стойностите на моите Nodes от head и tail

class Number{ 

class Node
{
        public int num=0;           // node's position in line
        public Node next=null;  // Reference to next node
        /**
        * Node constructor, initializes number
        */

        public Node(int number)
        {
               //
            num = number;
            next = null;
        }

        public String toString() {
            return "" + num;
        }

}

private int number;
private Node head = null;   // Linked list of prisoners
private Node tail = null;   // Tracks end of list as it is constructed

/**
 * constructs a circular linked list of
 * @param n Nodes, current is the first Node and tail is the last Node (next of tail is current)
 */

public Number(int n)
{
    //
    number = n;
    LinkedList numb1 = new LinkedList();
    for (int i = 1; i <= number; i++) {
        numb1.add(i) //head I will have 1, 2, 3... n
    }
    head = null; //how would I make this reference head?
    tail = null; //how would I make this reference tail?
 }

/*
 * prints all Numbers starting from head until tail
 */
@Override
 public String toString()
 {
//
     String strVal = "";
     for (Node current = head; current != null; current = head.next) {
         strVal = strVal + current.num;
     }
     return strVal;
 }

Мисля, че причината за това е в for loop.
Като имам current != null, той продължава, защото current никога не може да бъде нула, тъй като препраща безкрайно, защото е кръгов свързан списък. Въпреки това, това поне би върнало нещо вместо нищо.

Кажете да се обадя на Number newNum = new Number(6);
System.out.println(newNum);
Трябва да пусна
1 2 3 4 5 6


person user3011391    schedule 21.11.2013    source източник
comment
Чакай, имаш ли вложен клас с име Node$Node?   -  person chrylis -cautiouslyoptimistic-    schedule 21.11.2013
comment
Не, аз не. Това ще бъде ли в моя конструктор?   -  person user3011391    schedule 21.11.2013
comment
Това са избрани копирани и поставени битове от вашия код, очевидно разпръснати на случаен принцип. Имаме нужда от целия действителен код, за да помогнем.   -  person chrylis -cautiouslyoptimistic-    schedule 21.11.2013
comment
Това всъщност е всичко.   -  person user3011391    schedule 21.11.2013


Отговори (2)


  1. първо трябва да поправите конструктора на номера. Трябва да присвоите главата на първия възел и опашката на последния възел
 public Number(int n) {
        number = n;
        head = new Node(0);
        Node prev = head;
        for (int i = 1; i <=number; i++) {
            Node node = new Node(i);
            prev.next=node; // head I will have 1, 2, 3... n
            prev=node;
        }
        tail=prev;
    }

2 . И в метода toString вие винаги препращахте към head.next, което причиняваше безкраен цикъл, тъй като никога не удряте null (current != null никога няма да стане true във вашия код)

 public String toString() {
        String strVal = "";
        for (Node current = head; current != null; current = current.next) {
            strVal = strVal +" "+ current.num;
        }
        return strVal;
    }

редактиране: Едно нещо, което бих искал да добавя е, че вашата реализация е на обикновен свързан списък, а не на кръгъл свързан списък.. За да го направите кръгъл, трябва да насочите опашка към глава,tail=head

person Pranalee    schedule 21.11.2013
comment
Така че в края на моя конструктор бих decalre tail.next = head? - person user3011391; 21.11.2013
comment
да ще трябва също да промените част от логиката на преминаване в метода toString. - person Pranalee; 21.11.2013
comment
Когато направих това, получих NullPointerException, така че това би означавало, че използвам Null неправилно, когато правя tail.next = head Разбирам логиката на have tails.next = head, защото сега последният node е свързан с първия node създайте кръга но защо получавам това изключение? - person user3011391; 21.11.2013
comment
Актуализация: Отървах се от изключението, сега просто трябва да поправя логиката си toString - person user3011391; 21.11.2013

Отидете с тази структура от данни

class CList {

 int size;
 CNode head;

class CNode {
 int data;
 CNode next; 

}

}

В конструктора за CList инициализирайте head до null и size до 0.

person Nishant    schedule 21.11.2013