首页新闻找找看学习计划

链表反转,照抄都失败,我到底错哪里了?求助大牛

0
悬赏园豆:10 [待解决问题]

链表代码如下:

public class MySingletonList {
    Node head = new Node(null);
    //添加节点:
    public boolean add(Node data){
        Node temp = head;
        //先要找到链表的最后一个节点,新加的节点就要加到链表的最后,
        while(true){
            if(temp.next == null){
                break;
            }
            temp = temp.next;//头结点往后移动
        }
        temp.next = data;//把新加的节点加到后面。
        return true;
    }
    
    
    //打印链表
    public void showList(){
        Node temp = head.next;
        if(temp == null){
            System.out.println("空链表");
            return;
        }
        while(true){
            if(temp == null){
                break;
            }
            System.out.println(temp.data);
            temp = temp.next;//往后移动
        }
    }
    
    //反转链表 这是抄博客上的写法的,我自己对循环内的代码也还是一知半解
    public Node reversList(Node head){
        Node pre = null;
        Node next = null;

        while (head != null) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
        }
}

//节点类的代码,我贪图方便,就不写成内部类了
class Node{
    public Object data;
    public Node next;
    public Node(Object data){
        this.data = data;
    }
    @Override
    public String toString() {
        return "Node [data=" + data + ", next=" + next + "]";
    }
}

这一步完全就是照抄的,都错了,我自己想的更加没法看,求大神看看,我究竟错哪里了?
以下是测试代码:


public class Test {

    public static void main(String[] args) {
            MySingletonList  list = new MySingletonList();
            Node n1 = new Node(1);
            Node n2 = new Node(2);
            Node n3 = new Node(3);
            Node n4 = new Node(4);
            list.add(n1);
            list.add(n2);
            list.add(n3);
            list.add(n4);   
            list.showList();
            System.out.println("@@@@@@@@@@");
            list.reversList(list.getHead().next);
            list.showList();
    }
}

控制台出来的结果是这样的

1
2
3
4
@@@@@@@@@@
空链表
lukely的主页 lukely | 菜鸟二级 | 园豆:222
提问于:2019-08-13 11:34
< >
分享
所有回答(2)
0

这个编辑器可以格式化代码的:

class Node{

    public Object data;
    public Node next;

    public Node(Object data){
        this.data = data;
    }

    @Override
    public String toString() {
        return "Node [data=" + data + ", next=" + next + "]";
    }

}

添加节点创建成一个链表:
public boolean add(Node data){
    Node temp = head;
//先要找到链表的最后一个节点,新加的节点就要加到链表的最后,
    while(true){
        if(temp.next == null){
            break;
        }
        temp = temp.next;//头结点往后移动
    }

    temp.next = data;//把新加的节点加到后面。
        return true;
}

反转的代码:
public Node reversList(Node head){
    Node pre = null;
    Node next = null;

    while (head != null) {

        next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;     
}

遍历链表的代码:
//打印链表
public void showList(){
    Node temp = head.next;
    if(temp == null){
        System.out.println("空链表");
        return;
    }
    while(true){
        if(temp == null){//如果当前节点为null,退出循环。
            break;
        }
        System.out.println(temp.data);
        temp = temp.next;//往后移动
    }
}

看不出哪里错了,结果不对吗?最好贴上完整的代码,并且格式化一下。

会长 | 园豆:5332 (大侠五级) | 2019-08-13 11:40

谢谢,我不知道怎么设置这里的代码格式。我百度一下看看。

支持(0) 反对(0) lukely | 园豆:222 (菜鸟二级) | 2019-08-13 12:12

@lukely:修改一下reversList方法吧。

支持(0) 反对(0) 会长 | 园豆:5332 (大侠五级) | 2019-08-13 13:54

反转根本就不用传参数了:

    public void reversList(){
        Node pre = null;
        Node next = null;

        while (head != null) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        if (pre != null){
            head = pre
         }
    }

我没有Java环境,不确保是否正确,大概是这样子。不用传参数,反转自己不需要别的参数啊。反转后把head指向原来未反转时最后一个元素就好了。

支持(0) 反对(0) 会长 | 园豆:5332 (大侠五级) | 2019-08-13 14:04

@会长: 我知道问题出在哪里了
问题出现在打印链表的函数里。因为这个函数的错误,干扰了对后面的判断。谢谢你。

public void showList(){
    Node temp = head.next;
    if(temp == null){
        System.out.println("空链表");
        return;
    }
    while(true){
        if(temp == null){//如果当前节点为null,退出循环。
            break;
        }
        System.out.println(temp.data);
        temp = temp.next;//往后移动
    }
}
支持(0) 反对(0) lukely | 园豆:222 (菜鸟二级) | 2019-08-13 16:33

@lukely: 哦,是有问题。不过反转那个函数传入一个参数确实是没有必要、

支持(0) 反对(0) 会长 | 园豆:5332 (大侠五级) | 2019-08-13 16:37

@会长: 请问这个格式化代码 是怎么弄的?

支持(0) 反对(0) Jinke2017 | 园豆:220 (菜鸟二级) | 2019-08-13 19:55

@Jinke2017: 在代码头 英文状态下 按下1 右边的 按三下 代码结束后,再来三下

支持(0) 反对(0) lukely | 园豆:222 (菜鸟二级) | 2019-08-13 20:47

@lukely: 明白了,谢谢。

支持(0) 反对(0) Jinke2017 | 园豆:220 (菜鸟二级) | 2019-08-13 21:07
0

楼主,reversList(Node head);这个方法 return pre; 之前加上这一句 this.head.next = pre; 应该就可以了。
public Node reversList(Node head){
........
while (head != null) {
.........
}
this.head.next = pre; // 加上这一句,因为链表翻转了,所以要 更新头节点的下一个节点。
return pre;
}

Jinke2017 | 园豆:220 (菜鸟二级) | 2019-08-13 15:15

谢谢!

支持(0) 反对(0) lukely | 园豆:222 (菜鸟二级) | 2019-08-13 16:34

@lukely: 不客气。

支持(0) 反对(0) Jinke2017 | 园豆:220 (菜鸟二级) | 2019-08-13 16:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册