java实现链表的反转

本文介绍了如何使用Java实现单链表的反转。通过调整链表节点的指针,详细讲解了反转过程,并提供了相应的代码实现,包括反转前后的节点遍历展示。

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

需求
实现单链表的反转

示例:




思路(在了解链表结构的情况下,只需要看reverseList方法即可):
单链表的结构是,节点本身除了存储数据外,还会通过指针记录当前节点的下个节点。需求中需要实现反转功能,只需要调整指针即可。eg:假设有A/B/C三个节点,现在要将B节点换到第一个位置上,对于B节点来说,我需要知道我前面的节点和后面的节点。首先知道B节点前面的节点,那么就知道B节点调整后的指针需要指向的位置(调整后,B节点指针需要指向A);其次我知道B节点后面的节点,那就意味着我知道下一个需要反转的节点是哪个;最后我还需要知道我当前需要反转的节点,即B。

代码:

package com.demo.git;

public class ListNode {

    protected int val;

    protected ListNode next = null;

    ListNode(int val) {

        this.val = val;

    }

}

class Solution {

    public ListNode reverseList(ListNode head) {

        ListNode preNode = null;//前一个元素

        ListNode currNode = null;//当前元素

        ListNode nextNode = null;//记录当前正在遍历的下一个节点

        do{

            if(null == head){//如果当前节点是空,则直接返回

                return null;

            }

            if(null == preNode){//遍历第一个元素后,针对下个元素的前一个元素、下一个元素重新赋值

                currNode = head;//当前元素

                preNode = head;

                nextNode = head.next;//后续需要遍历的元素

                currNode.next = null;

            }else{

                currNode = nextNode;

                nextNode = nextNode.next;

                currNode.next = preNode;

                preNode = currNode;

            }

        }while(null != nextNode);

        return currNode;

    }

    public static void main(String[] args) {

        ListNode five = new ListNode(5);

        ListNode four = new ListNode(4);

        ListNode three = new ListNode(3);

        ListNode second = new ListNode(2);

        ListNode head = new ListNode(1);

        head.next = second;

        second.next = three;

        three.next = four;

        four.next = five;

        System.out.print("反转前的结果:");

        ListNode node = head;

        while(null != node) {

            System.out.print(node.val+"\t");

            node = node.next;

        }

        System.out.print("\n\n反转后的结果:");

        node = new Solution().reverseList(head);

        while(null != node) {

            System.out.print(node.val+"\t");

            node = node.next;

        }

    }

}

自愿打赏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿猴乐园

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值