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个常见的链表代码练习小楠楠版代码
网友评论