总结几个写链表的代码技巧

最近在学习算法,俗话说好记忆不如烂笔头,写下来,方便以后的翻找查阅。

技巧一 :理解指针或者引用的含义

看懂链表结构不是很难,但是一旦把它和指针混在一起,就很容易让人摸不着头脑,(我再写代码的时候就出现了这种情况),所以要想写对链表代码,首先要理解好指针。

实际上,对于指针的理解,你只需要记住下面这句话就可以了:将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。

技巧二:警惕指针丢失和内存泄露

在写链表代码的时候,经常会找不到指针(引用)指到了哪儿,会弄丢了指针。

例如在单向链表中插入节点x,前节点是p,后节点是b。

p.next = x ;

x.next = p.next;

这样就会导致指针丢失和内存泄露。如果把两行代码的顺序颠倒一下,就不会丢失指针,要先将x.next指向b,然后,在将p的next节点指向x,这样才不会丢失指针导致内存泄露。

技巧三:利用哨兵简化实现的难度

哨兵,解决的是国家之间的边界问题。同理,这里说的哨兵也是解决"边界问题"的,不直接参与业务逻辑。(还不是很了解,之后再补充)。

技巧四:重点留意边界条件处理

软件开发中,代码在处理一些边界问题或者异常情况中,容易出现bug。链表代码也是容易产生bug,要想实现没有bug的链表代码,一定要在编写的过程中以及在编写完之后,检查边界条件是否考虑的全面,以及代码在边界条件下是否能正常运行。

经常用来检查链表代码是否正确的边界条件有如下几个:

  • 如果链表为空,代码是否能正常运行?
  •  如果链表只包含一个节点时,代码是否正常运行?
  • 如果链表只包含两个节点时,代码是否正常运行?
  • 代码在处理头节点和尾节点时,代码是否正常运行?

我们在写代码的时候也不要只是实现业务逻辑就完事,也要多考虑会遇到哪些边界问题或者异常情况,遇到了应该如何解决,这样写出来的代码才会健壮。

技巧五:举例画图,辅助思考

举例画图,这个太有用了,我再学习算法的过程中,有时候看不懂实现代码的时候,就想着如何通过画图来分解代码的实现步骤,感谢在学习中,帮助过我的朋友,让我能够理解实现的过程。

在这里举例一个有序链表的合并的代码: 

//有序链表合并
public static Node mergeSortedList(Node la,Node lb){
    if (la==null) return lb;
    if (lb==null) return la;

    Node p = la;
    Node q= lb;
    Node headNode;
    if(q.data<p.data){
        headNode=p;
        p=p.next;
    }else{
        headNode= q;
        q=q.next;
    }
    Node r= headNode;
    while (p!=null&&q!=null){
        if (q.data<p.data){
            r.next= p;
            p= p.next;
        }else{
            r.next=q;
            q=q.next;
        }
        r= r.next;
    }
    if (p!=null){
        r.next=p;
    }else{
        r.next=q;
    }
    return headNode;
}

画图辅助思考:

(上图要感谢我的朋友婷婷大佬的帮助)我们可以看到这个代码里就体现了边界问题的几个步骤,1、首先是链表为空时的处理。2、链表头的处理。3、链表多节点的处理。4,链表尾的处理。而图中的举例也正是对代码实现的分解的很好的解释。(画图辅助真的很棒) 

技巧六:多谢多练,没有捷径

就是把常见的链表操作都自己多写几遍。最开始我都是遇到了各种各样的不理解,甚至对于链表的操作都有些迷糊,但是多出问题多调试,慢慢的我们也能孰能生巧。唯手熟尔!

常见的链表操作,只要能熟练的写出来,不熟就多写几遍,保证之后就不会再害怕写链表代码。

  • 单链表反转
  • 检测链表中的环
  • 两个有序链表的合并
  • 删除链表中倒数第K个节点
  • 球链表的中间节点 

写出正确链表代码的六个技巧。分别是理解指针或引用的含义、警惕指针的丢失和内存泄露,利用哨兵简化实现难度,重点留意边界条件处理,以及举例画图,辅助思考,还有就是多写多练,唯手熟尔。

勤能补拙,生活就是养成游戏,勤练内功,即使当前不能花里胡哨,未来也会强壮到无人能敌!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值