在java中实现链表时遇到问题
我尝试使用以下代码在java中实现链表:在java中实现链表时遇到问题,java,data-structures,singly-linked-list,Java,Data Structures,Singly Linked List,我尝试使用以下代码在java中实现链表: class Linkedlist<T>{ private node head, tail; public Linkedlist(){ head = new node(null); tail = head; } public boolean insert(T value){ if(head.getValue() == null){
class Linkedlist<T>{
private node head, tail;
public Linkedlist(){
head = new node(null);
tail = head;
}
public boolean insert(T value){
if(head.getValue() == null){
this.head.setValue(value);
head.setNext(null);
return true;
}
node insertNode = new node(value);
tail.setNext(insertNode);
tail = insertNode;
return true;
}
public boolean insert(T value, int index) {
if ( sizeOfList() == index + 1 ) return false;
node temp = this.head.getNext();
node prvtmp = this.head;
for (int i = 0; i <= index; i++) {
temp = temp.getNext();
prvtmp = temp;
System.out.println("for loop");
}
node insertNode = new node(value);
System.out.println("node created");
prvtmp.setNext(insertNode);
insertNode.setNext(temp);
System.out.println("temps");
return true;
}
public int sizeOfList(){
int size = 0;
node temp = this.head;
while(temp.getNext() != null){
temp = temp.getNext();
size++;
}
return size;
}
public String[] rtrnList(){
node temp = this.head;
int listSize = sizeOfList();
String[] resualt = new String[listSize + 1];
for (int i = 0;i <= listSize;i++){
resualt[i] = String.valueOf(temp.getValue());
temp = temp.getNext();
}
return resualt;
}
}
程序没有到达打印完成的行,但是如果我们删除该行:list.insert(11,3)代码>
然后程序就可以正常工作了
输出:
for loop
for loop
for loop
for loop
node created
finish insert
当您更新prvtm和temp的值时,问题在insert(T值,int索引)方法的for循环中。在您的代码中,您首先将temp的值设置为temp.getnext(),并且由于temp已更改,因此将prvtmp设置为temp将创建一个循环,这就是为什么当您尝试打印列表时,它在计算列表大小时进入无限循环的原因
只需将prvtmp=temp行放在temp=temp.getNext()之前,就像下面的代码片段一样。这将解决问题
public boolean insert(T value, int index) { // 2 2 2 2 2 2
if ( sizeOfList() == index + 1 ) return false;
node temp = this.head.getNext();
node prvtmp = this.head;
for (int i = 0; i <= index; i++) {
prvtmp = temp;
temp = temp.getNext();
System.out.println("for loop");
}
node insertNode = new node(value);
System.out.println("node created");
prvtmp.setNext(insertNode);
insertNode.setNext(temp);
System.out.println("temps");
return true;
}
公共布尔插入(T值,int索引){//2
if(sizeOfList()==index+1)返回false;
node temp=this.head.getNext();
节点prvtmp=this.head;
for(int i=0;i在更新prvtm和temp的值时,问题在insert(T value,int index)方法的for循环中。在代码中,首先将temp的值设置为temp.getnext()由于temp已经更改,将prvtmp设置为temp将创建一个循环,这就是为什么当您尝试打印列表时,在计算列表大小时,它将进入一个无限循环
只需将prvtmp=temp行放在temp=temp.getNext()之前,就像下面的代码片段一样。这将解决问题
public boolean insert(T value, int index) { // 2 2 2 2 2 2
if ( sizeOfList() == index + 1 ) return false;
node temp = this.head.getNext();
node prvtmp = this.head;
for (int i = 0; i <= index; i++) {
prvtmp = temp;
temp = temp.getNext();
System.out.println("for loop");
}
node insertNode = new node(value);
System.out.println("node created");
prvtmp.setNext(insertNode);
insertNode.setNext(temp);
System.out.println("temps");
return true;
}
公共布尔插入(T值,int索引){//2
if(sizeOfList()==index+1)返回false;
node temp=this.head.getNext();
节点prvtmp=this.head;
对于(int i=0;i,插入时有循环引用,您可以将此代码用于上述目的
public boolean insert(T value, int index) {
if(index > sizeOfList())
{
return false;
}
else if(index == sizeOfList())
{
if(insert(value))
return true;
else
return false;
}
else
{
node previous = this.head;
for (int i = 1; i <= index; i++) {
if(i==index-1)
{
node newnode = new node(value);
newnode.setNext(previous.getNext());
previous.setNext(newnode);
break;
}
previous = previous.getNext();
}
}
return true;
}
当插入循环引用时,您可以将此代码用于上述目的
public boolean insert(T value, int index) {
if(index > sizeOfList())
{
return false;
}
else if(index == sizeOfList())
{
if(insert(value))
return true;
else
return false;
}
else
{
node previous = this.head;
for (int i = 1; i <= index; i++) {
if(i==index-1)
{
node newnode = new node(value);
newnode.setNext(previous.getNext());
previous.setNext(newnode);
break;
}
previous = previous.getNext();
}
}
return true;
}
声明的insert方法只接受一个参数,如果要处理多个参数,则需要以其他方式重写此方法,或使用处理多个参数的不同签名将其重载。我重载insert方法我实际上有2个insert。如果您还可以发布程序的输出,这将非常有用。Y你有很多System.out.println()
这可能有助于跟踪错误。好的,我将编辑postyour insert方法,正如声明的那样,只接受一个参数,如果您想处理多个参数,您需要以其他方式重写此方法,或者使用处理多个参数的不同签名重载它。我重载insert方法我实际上有2个insert。它如果你也能发布程序的输出,那会很有帮助。你有很多System.out.println()
,可以帮助追踪错误。好的,我会编辑帖子。我很佩服你的编码技能。这对我很有帮助。我很佩服你的编码技能。这对我很有帮助
public boolean insert(T value, int index) {
if(index > sizeOfList())
{
return false;
}
else if(index == sizeOfList())
{
if(insert(value))
return true;
else
return false;
}
else
{
node previous = this.head;
for (int i = 1; i <= index; i++) {
if(i==index-1)
{
node newnode = new node(value);
newnode.setNext(previous.getNext());
previous.setNext(newnode);
break;
}
previous = previous.getNext();
}
}
return true;
}
[2, 2, 11, 2, 2, 2, 2]