【犯二记录】链表结点换位引发的思维僵化,太可怕,智商 == 0

今天由于业务需要,把之前写的链表结构改造成了双向链表,并添加了一些功能上去,在这其中某个功能需要对链表在插入时进行排序。
为什么是插入的时候排序不是最后再排序呢,不是多次一举吗?其实这是根据我们的业务需求决定的,在这里数据某段时间内是集中在几个key上的,但是数据量又非常大,所以就很直接的选择了最简单的双向链表在每次插入的时候重新定位,其实类似于堆排序中的上升,每次找到需要改变的结点进行操作后,调用函数进行上升即可。
那么,这里遇到什么问题呢?我们一步一步顺着这个严肃的思路来。

第一:既然是要上升,肯定是要交换位置,最简单的算法
1. 跟prev结点比较,如果需要上升,交换结点;
2. 循环1,直到不需要上升停止。

当然,自我感觉这种方法怎么会是我能想出来的呢。。扯淡!要不要重新回学校玩个几年。

第二:只要一直往上找,找到最后一个需要交换的进行交换即可,这样不是次数少了么
1. 跟prev结点比较,如果需要上升,记录结点;
2. 循环1,直到不符合要求,交换结点。

这个过程中,更有问题了,最关键的问题来了,我竟然不会交换链表结点了,普通的方法总感觉好乱,要考虑各种边界,然后交换的时候那么多指针,没有任何头绪。总不能保存两个tmp来交换把,太丢人了。

第三:折腾了半个小时,各种乱,binggo一声,我链表存的是指针啊,干嘛要交换结点,那么多指针,我直接交换value的指针不就很简单很ok么,操作也少。。给自己跪一跪Orz。

但是,我们明明想了一半交换节点,突然有了好方法我会就此放弃?写代码不服输的好吗?晚上游戏我都不玩了,我一定得好好想想。

第四:突然觉醒,理清思路,它是要交换结点,但是结点和结点间也是有不同的,画画图大家就能看很清晰了
1. 结点是分为三种的,一种是我们要交换的结点(两个),另一种是与我们要交换的两个结点有关联(指针指向或者被指向),最后一种是其他无关结点,不会影响我们的交换。
2. 交换的时候我们主要是把1类结点和2类结点之间的指针修改目的结点即可,但是由于我们要交换的结点会进行移动,我们要通过没移动前的他们来获取他们的前后结点,所以起码得有一个tmp来给我们定位。
3. 在交换前我们可以先对2类结点指向1类的那些指针做修改,因为他们不会影响交换的过程。
4. 这样的话我们就只剩下了1类结点指向前后位置的修改了,这里就更像两个变量值的交换了,只要保留一个tmp,先对另一个做修改即可完成。

写着写着,突然清晰了对不对,虽然看上去字太多很乱,自己捋一捋,就很好了,图都懒得画了,都在心里,哈哈哈。
然而。。。还没开心够- -发现一个大bug!方法2开始又出问题了,交换个p啊,我们要做的是冒泡和堆式的上升,如果只是交换,那大小不还是乱序么?

第五:按照最开始的方法,不交换结点,只交换指向的value
1. 跟prev结点比较,如果需要上升,交换结点中的value指针;
2. 循环1,直到不需要上升停止。

总结一下:
1. 遇到要解决的问题一定要好好的理一下思路,对问题好好划分一下,再复杂的事情也有简单的逻辑
2.  再困难的事也有简单的办法,一定要好好想一想,看一看是不是都考虑到了,比如这次根本不需要对指针操作那么多,明明交换变量就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值