java 链表逆转_问个java链表逆转的问题

代码如下,先输入一些数初始化一个链表,然后将其逆转.但是不知道为什么进入Reversion()方法后,就死循环了.好像是在最后两个结点之间死循环!求解决!importjava.util.Scanner;publicclas...

代码如下,先输入一些数初始化一个链表,然后将其逆转.但是不知道为什么进入Reversion()方法后,就死循环了.好像是在最后两个结点之间死循环!

求解决!

import java.util.Scanner;

public class Homework5 {

public static void main(String[] args){

LinkedList ll = new LinkedList(); //生成一个双向链表

System.out.println("请输入要插入的值,输入0结束"); //初始化链表

Scanner s = new Scanner(System.in);

while(true){

int value = s.nextInt();

if(value==0) break;

ll.Insert(new LinkedNode(value));

}

System.out.println("逆转前");

ll.DisplayLinkedList(ll); //在逆转前,把链表的值输出一次

ll = ll.Reversion(ll); //逆转链表

System.out.println("逆转后");

ll.DisplayLinkedList(ll); //逆转后,把链表的值输出一次

}

}

//定义结点类

class LinkedNode{

int value; //结点存放的值

public LinkedNode(int value) { //给结点值赋值的构造器

this.value = value;

}

LinkedNode previous = null; //指向前一个结点

LinkedNode next = null; //指向下一个结点

}

//定义双向链表类

class LinkedList {

public LinkedNode Head = null; //双向链表的表头结点

public LinkedNode Last = null; //双向链表的最后一个结点

//向链表插入结点的方法

void Insert(LinkedNode ln){

if(Head==null){ //如果头结点为空,那么附值给头结点

Head = ln;

Last = Head; //Last(最后一个结点)指向Head,因为此时只有一个结点,所以即是头结点,也是最后一个结点

} else {

Last.next = ln; //将要插入的结点附给Last.next

Last.next.previous = Last; //新插入的结点的前一结点指向Last

Last = Last.next; //更新Last为最后一个

}

}

//逆转链表的方法

LinkedList Reversion(LinkedList ll){

LinkedList re = new LinkedList(); //新实例一个双向链表

while(ll.Last!=null){ //将传入的链表从最后一个结点开始,依次插入到新链表中,直到ll.Last为空(即头结点的前指针)

System.out.println(ll.Last.value);

re.Insert(ll.Last);

ll.Last = ll.Last.previous;

}

return re;

}

//把链表的值输出一次

void DisplayLinkedList(LinkedList ll){

LinkedNode Temp = ll.Head;

while(Temp!=null){

System.out.println(Temp.value);

Temp = Temp.next;

}

}

}

展开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现链表逆转的示例代码: ```java public class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; } } public class LinkedListReverse { public ListNode reverse(ListNode head) { ListNode prev = null; while (head != null) { ListNode next = head.next; head.next = prev; prev = head; head = next; } return prev; } } ``` 上述代码中,`ListNode`表示链表节点,包含一个整数值`val`和指向下一个节点的指针`next`。`LinkedListReverse`类包含一个`reverse`方法,用于将给定链表逆转。 `reverse`方法使用三个指针`prev`、`head`和`next`。首先将`prev`指向空节点,然后循环遍历链表,每次将`head`的下一个节点指针`next`保存下来,然后将`head`的下一个节点指向`prev`,再将`prev`指向`head`,最后将`head`指向之前保存的`next`。当循环结束后,`prev`指向逆转后的链表头节点,返回`prev`即可。 可以使用以下代码来测试链表逆转: ```java public static void main(String[] args) { ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); head.next.next.next = new ListNode(4); head.next.next.next.next = new ListNode(5); LinkedListReverse solution = new LinkedListReverse(); ListNode reversed = solution.reverse(head); while (reversed != null) { System.out.print(reversed.val + " "); reversed = reversed.next; } } ``` 此代码将创建一个包含五个节点的链表,然后将链表逆转并输出逆转后的结果。输出结果为`5 4 3 2 1`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值