JAVA 实现单向链表的反转

本文介绍了如何在JAVA中实现单向链表的反转。通过遍历原链表,保存当前节点的next,将其添加到新链表的头部,并更新指针,最终完成链表反转。提供代码实现及测试结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 JAVA 实现带头结点的链表根据节点大小按顺序新增、修改、删除节点 该文章已实现单向链表的创建及遍历等操作。

那么在此基础上,如何实现单向链表的反转呢?

实现思路:

1、遍历原链表,并定义临时节点current(当前遍历到的节点)
    1)遍历到一个节点,就将current的next 先存放到一个变量节点next中,因为要将当前节点插入到新链表,如果不存放当前节点的next就会导致遍历时指针丢失 即:next = current.next
    2)然后要将当前节点current添加到新链表的头节点后面,所以要建立current与新链表头节点上一次的next节点的关系,即:current.next = newhead.next。此时就建立了新链表中cur与next节点的关系。
    3)因为新链表中头节点与当前节点的关系还没有建立,所以需要新链表的头节的next需要指向当前插入的节点,即: newhead.next = current
    4)因为是循环,所以需要在遍历原链表时将指针后移,则 current= current.next。第一步已将cur.next存放到next中,所以直接赋值即可:current= next

2. 将原链表的头节点的next指向新链表的头节点next,即:head.next = newhead.next

 

代码实现

上代码:在SingleLinkedList2.class中添加以下方法

 //反转链表
    public void reverseSingleList(HeroNode2 head2){
        //如果当前链表为空,或者只有一个节点,无需反转,直接返回
        if(head2.next==null || head2.next.next==null){
            return;
        }
        HeroNode2 current = head2.next;
        HeroNode2 next =null;// 指向当前节点[current]的下一个节点
        HeroNode2 newhead = new HeroNode2(0,"","");
        //遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表 reverseHead 的最前端
        while (current!=null){
            next = current.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
            current.next = newhead.next;//将 current 的下一个节点指向新的链表的最前端
            newhead.next = current;//将 current 连接到新的链表上
            current = next;
        }
        //将 head.next 指向 reverseHead.next
        head2.next = newhead.next;
    }

 测试类:

public class SingleLinkedListDemo2 {

    public static void main(String[] args) {
        SingleLinkedList2 singleLinkedList = new SingleLinkedList2();
        HeroNode2 h1 = new HeroNode2(1,"AAA","A");
        HeroNode2 h2 = new HeroNode2(2,"BBB","B");
        HeroNode2 h3 = new HeroNode2(3,"CCC","C");
        HeroNode2 h4 = new HeroNode2(4,"DDD","D");

        singleLinkedList.addByOrder(h1);
        singleLinkedList.addByOrder(h3);
        singleLinkedList.addByOrder(h4);
        singleLinkedList.addByOrder(h2);
        singleLinkedList.list();

        singleLinkedList.reverseSingleList(singleLinkedList.getHeadNode());
        System.out.println("反转后的链表遍历~~~~~~~~~~~~");
        singleLinkedList.list();
 
    }

}

输出结果: 

HeroNode{no=1, name='AAA, nickName='A}
HeroNode{no=2, name='BBB, nickName='B}
HeroNode{no=3, name='CCC, nickName='C}
HeroNode{no=4, name='DDD, nickName='D}
反转后的链表遍历~~~~~~~~~~~~
HeroNode{no=4, name='DDD, nickName='D}
HeroNode{no=3, name='CCC, nickName='C}
HeroNode{no=2, name='BBB, nickName='B}
HeroNode{no=1, name='AAA, nickName='A}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值