这里我尝试交换一个单链表的头和尾
public void reversePI() {
Node N1 = this.tail;
Node Helper = this.head.next;
this.tail = this.head;
this.tail.next = null;
this.head = N1;
this.head.next = Helper;
this.display();
}
下面是上述函数的进一步的方法来解释我的思考方式。让我们假设我们有一个链表
4k(adress) 1(data)-->5k(adress) 2(data)-->6k(adress) 3(data)-->7k(adress) 4(data)-->null
我们有一个准则
现在当第一行执行时
N1= 7k(adress) 4(data)
Helper=5k(adress) 2(data)
this.tail=4k(adress) 1(data)
此时,列表应
5k(adress) 2(data)-->6k(adress) 3(data)-->4k(adress) 1(data)-->5k(adress) 2(data)
现在我们将tail设置为null以断开初始链接
this.tail.next = null;
5k(adress) 2(data)-->6k(adress) 3(data)-->4k(adress) 1(data)-->null
现在是这样的,头部= N1;
7k(adress) 4(data) 5k(adress) 2(data)-->6k(adress) 3(data)-->4k(adress) 1(data)-->null
之后,this.head.next= Helper;行将建立链接并
7k(adress) 4(data)--> 5k(adress) 2(data)-->6k(adress) 3(data)-->4k(adress) 1(data)-->null
我的Approch是否正确,或者我是否遗漏了什么,导致在运行display方法时生成无限输出--〉
public void display() {
Node current = this.head;
while (current != null) {
System.out.print(current.data + " ");
current = current.next;
}
}
1条答案
按热度按时间z9ju0rcb1#
你忘了处理倒数第二个节点的next,它应该指向新的tail,但是它仍然指向旧的tail,也就是新的head,这导致了一个循环:标题-〉... -〉第二个最后节点-〉标题