数据结构与算法笔记day04:链表(5个常见的链表代码练习)

    1单链表反转

        我画了一个图:

        以这个简短的链表为例,想要将它反转,就是使1指向null,使2指向1,使3指向2。

        当我们执行第一步,使1指向null之后,想自行使2指向1的时候,会发现1和2之间断连了。为了不使它们断连,我们需要记录下1和2。

        到这里,我的思路如下:

        先将下一结点纪录下来(next),然后让当前结点指向上一结点(pre,pre初始值为null,因为原链表的头结点反转后变成了尾结点,指向null),再将当前结点纪录下来(now变成了pre),再让下一结点变为当前结点(next变成了now)。

        开写之前,不要忘记先定义一个节点类哦。

        代码如下:

      运行结果:

        很简单的代码却写了很久,太久不写代码犯了好多好多错,最后还是对着图一步一步走程序改好的,中间now,next,pre的转换很容易乱的,一定要注意,对着图是个很好的办法。

    2链表中环的检测

        这题我自己没有思路,所以就在网上查了一下,在常见链表操作-链表中环的检测(JAVA实现)这篇博文中,提供了两种思路:

      解决思路1:快慢指针法

        这是最常见的方法。思路就是有两个指针P1和P2,同时从头结点开始往下遍历链表中的所有节点。

        P1是慢指针,一次遍历一个节点。

        P2是快指针,一次遍历两个节点。

        如果链表中没有环,P2和P1会先后遍历完所有的节点。

        如果链表中有环,P2和P1则会先后进入环中,一直循环,并一定会在在某一次遍历中相遇。

        因此,只要发现P2和P1相遇了,就可以判定链表中存在环。

       
        解决思路2:足迹法

        顺序遍历链表中所有的节点,并将所有遍历过的节点信息保存下来。如果某个节点的信息出现了两次,则存在环。

        我选择用第一种思路来解决。

        代码如下:

        运行结果:

      设置一个为环的链表:

        再次检测的结果:

        (因为是环所以这次就不打印链表啦,否则会陷入死循环~)

        问题:

        检测环函数中注释里的问题,为什么快指针和慢指针这样设置会报错:NullPointerException

    3两个有序的链表合并

        思路:

        假设为从小到大排列的顺序,那么将这两个链表的头结点进行对比,小的那个作为新合并链表的头结点,并向后移动当前指针,然后继续对比两个链表当前指针位置的数字大小,直到其中一个链表遍历完成,另一个链表中剩下的结点按原顺序直接插入到新合并链表的尾部。

        代码:

        运行结果:

()


    4删除链表倒数第 n 个结点

        思路:

        设置两个指针n1和n2,刚开始都指向头结点,先让n1走n-1步,然后n1和n2再同时遍历,当n1到达尾部时,n2所指的结点就是要删除的结点。

      代码:

        运行结果:

    5求链表的中间结点

        思路:

        设置两个指针,快指针fast和慢指针slow,fast每次走两步,slow每次走一步,fast走完的时候,slow就到达中间结点了。   

        代码:

        运行结果:   

        啊~好开心,虽然前两个因为好久没编程出了很多小错误,但是后面越来越顺,写的越来越快错误越来越少,虽然都是简单的小程序,可是好有成就感呀!又重新感受到了之前编程的快乐,我爱编程!(*^__^*) 嘻嘻

        完整代码见我的github:5个常见的链表代码练习小楠楠版代码

你可能感兴趣的:(数据结构与算法笔记day04:链表(5个常见的链表代码练习))