将单向链表进行的反转的过程中,出现重复循环打印前两个节点的现象,找了很多的原因,最后发现将原链表的节点放到反向链表中的时候,在最后一个节点中忘记将next指向空,导致方向链表中的最后一个节点与倒数第二个节点直接相互为next的指向节点,出现了循环调用的情况。 链表的每个节点不是独立的个体,要注意链表的尾节点的指向,否则就会形成局部环状链表。
将最后的一个节点指向空,
代码为 temp1.next=null;//加上这一句,代码就可以将最后一个节点的next指针指向null,这样就可以避免出现相互为下一个节点的现象,从而防止最后两个节点被重复的打印。
package linked_list;
public class Reserve
{
public static HeroNodereserveHeroNode=new HeroNode(0,null,null);//定义一个新的链表的头结点
public static HeroNodereserve(HeroNode headNode)//提供需要反转的链表的头结点
{
int num=0;
int i=0;
HeroNode temp=headNode;//定义原链表的临时指针变量
HeroNode temp1=reserveHeroNode;//定义新链表的新指针变量
if(headNode.next==null)//检测给定的链表是否为空
{
System.out.println("链表是空的");
return null;
}
while(true)
{
if(temp.next==null)//遍历给定的链表,给出节点的个数,以便于后面的程序将节点找出来。
{
break;
}
num++;
temp=temp.next;
}
temp=headNode;//将temp指针复位到链表的头部。
while(true)
{
if(num==0)//将反转的链表打印出来
{
temp1.next=null;
temp1=reserveHeroNode;
System.out.println("链表已经反转完成");
while(true)
{
if(temp1.next==null)
{
return reserveHeroNode;
}
temp1=temp1.next;
System.out.println(temp1);
}
}
if(i==num)//将链表进行翻转
{
// if(num==0)
// {
// System.out.println(temp1.next.next);
// temp1.next.next=null;
//
// }
temp1.next=temp;
temp1=temp1.next;//将链表的节点进行重新排序。
System.out.println(temp1);
num--;
i=0;
temp=headNode;
}
temp=temp.next;
i++;
}
}
}