下面是我从第二个节点(即我插入值的起始节点旁边的节点(打印循环单链列表的代码。但我的代码似乎无法将最后一个节点链接到我的起始节点。因此,我无法打印我的循环链接列表。
有人能纠正我的错误吗?
输入:1 2 3 4
预期O/p:2 3 4 1
O/p获取:2 3 4
import java.util.Scanner;
public class CircularLinkedList {
CircularLinkedList ptr,head,next;
int v;
void headcre()
{
head=new CircularLinkedList();
ptr=head;
}
void linkcre(int n)
{
Scanner sc=new Scanner(System.in);
ptr=head;
System.out.println("Enter elements of list");
for(int i=0;i<n;i++)
{
ptr.v=sc.nextInt();
ptr.next=new CircularLinkedList();
ptr=ptr.next;
}
ptr.next=head; //TO LINK LAST NODE TO STARTING NODE
}
void printcre()
{
ptr=head;
ptr=ptr.next; //printing the list from the second node
while(ptr.next!=head)
{
System.out.print(ptr.v+" ");
ptr=ptr.next;
}
}
public static void main(String[] args) {
CircularLinkedList obj=new CircularLinkedList();
System.out.println("Enter number of elements to be present in the list");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
obj.headcre(); //To create starting node
obj.linkcre(n); //To enter elements
obj.printcre(); //To print the list
}
}
一些问题:
-
您的代码试图将两个不同的概念放入一个类中:列表的节点和列表本身。奇怪的是,
CircularLinkedList
类的第一个实例充当head
的容器,而其他实例(也有一个仍然无用的head
引用(充当列表的实际数据节点。你应该为每一个单独的类。 -
代码在节点中存储值之前创建该节点。这意味着您的列表将始终有一个未用于数据的节点。因此,当所有输入都存储在节点中时,又创建了一个没有数据的节点(
ptr.v
仍处于未初始化状态(。 -
在
printcre
中,当访问head
节点时,循环退出,因此永远不会打印该节点的值。 -
在这样一个类的方法中执行I/O不是一种好的做法。在主代码中保留I/O,并提供一些方法来完成纯列表的工作,或者可能生成列表的字符串表示。但不要在这些方法中执行I/O操作。混合这样的担忧不是一个好习惯。
-
对于循环列表,保留对尾部的引用实际上比对头部的引用更有趣,因为头部可以很容易地从尾部找到(它是它的继任者(,而从头部获得尾部需要遍历所有节点。
以下是我建议的代码:
ListNode类
public class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = this; // Make circular by default
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
CircularLinkedList类
public class CircularLinkedList {
ListNode tail = null;
public void append(int data) {
if (tail == null) {
tail = new ListNode(data);
} else {
tail = tail.next = new ListNode(data, tail.next);
}
}
public String toString() {
if (tail == null) return "";
String s = "";
ListNode node = tail.next.next;
while (node != tail.next) {
s += node.val + " ";
node = node.next;
}
return s + node.val; // Also include the head's value in the string
}
}
驱动程序代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter number of elements to be present in the list");
int n = sc.nextInt();
CircularLinkedList list = new CircularLinkedList();
System.out.println("Enter elements of list");
for (int i = 0; i < n; i++) {
list.append(sc.nextInt());
}
sc.close();
System.out.println(list.toString());
}