剑指offter Java单链表反转

应上篇文章说的做一篇单链表的反转问题。关于怎么创建单链表问题我已经写过了一篇:https://blog.csdn.net/nisemono_ct/article/details/95514797
单链表反转
之前没弄懂单链表的结构,所以做起来一头雾水,但是弄懂以后,看单链表就类似于一个ArrayList,除了存储结构不一样,区别不大。
先放代码,然后在详细解释吧思想吧。为了更直观看到地址的变化,我选择了在DeBug模式下运行的。

public void ReverseList(){              //单链表反转
        ListNode newHead=null;              //创建一个新链表
        ListNode pNode=head;                //pNode记录链表当前的头地址
        while(pNode!=null){
            ListNode pNext=pNode.next;      //记录当前链表的下一个地址
            ListNode p=pNode;               //记录当前链表的总长度

            p.next=newHead;                 //当前地址的指向,让他指向一个新的链表
            newHead=p;                      //让新链表记录,新建的链表地址以及长度

            pNode=pNext;                    //上边操作过了p,所以必须要让pNode等于当前链表下一个节点 否则链表会断掉
        }
        head=newHead;

但是Debug参数没办法复制,我放上一张图片。
在这里插入图片描述
之前以为Java不存在指针,然而实际情况确实Java中有指针,只是我们一般用不到。再说思路前,先画一张图,表述一下单链表的结构吧。
在这里插入图片描述
链表地址可以不连续,因为有next指针指向下一个地址。这里连续是因为程序在运行的过程中开辟的是一段连续的地址空间。
先介绍一下我的思路方式。我是创建了一个新的链表,然后让新链表,一节一节的吃掉原来的链表,吃到最后,就会出现循序反转的情况。
在这里插入图片描述
第一次循环后,指针位置。
实际上除了中间的两行代码:

p.next=newHead;                 //当前地址的指向,让他指向一个新的链表
newHead=p; 

其他的代码一直都是在记录地址位置,防止链表指向空后,找不回来了。
这两行代码干了什么事呢,没执行一次循环,newHead就吃一个节点。一共五个循环,我放五张图表述吧,语言不好组织,也不形象。

为了防止图片表达不能清楚描述,前边三幅图都是没执行循环中pNode=pNext; 语句的地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写在最后的,Java中的指针和C++是一样的,地址值发生改变,相对的指针指向的值都会改变。拿最后一张图举例,如果对pNext执行一个pNext=newHead操作。pNode与p都会指向newHead。如果你发现你的链表经常中断,不妨看下是不是改变了地址中的值。

希望这篇博客能帮助新手更好理解链表,也希望大佬指正出写的错误,和不到位的地方。

发布了16 篇原创文章 · 获赞 1 · 访问量 875

猜你喜欢

转载自blog.csdn.net/nisemono_ct/article/details/95735986