两种方式讲链表节点删除

发布时间 2023-10-30 23:33:52作者: 糖子哥

第一种讲法就是循环的方式,因为要循环遍历这个链表,所以我们会运用到一个很重要的哨兵思想,就是定一个没啥意义的哨兵,让head “make sense”,接着,我们的任务是对链表进行删除,那就涉及到一个前端链表的指向问题,但是现在这个是单向链表,我们无法知道你前面那个是谁,所以我们也可以想办法得到前端链表,所以,我们就约定两个指针p1,p2. 当我们假如让p2扮演遍历的角色,那么它的跟屁虫p1就可以很高效地帮我们找到前端,这就是一个思想,现在就是老样子,当p2 null的时候停下来,用while一直走,然后大致思路就是,p1跟着p2走,遇到val等的时候,p1改变指向(换大哥)(

p1.next = p2.next;

),p2接着往前走,硬生生又成为它的大哥

p2=p2.next;,为什么写在if else外面呢,因为不管是否满足条件,p2都要往下走



接下来是令人头大的递归

递归怎么讲呢。。。老样子导入等于null就null,然后下面看if else,满足条件,就return listnode.next,啥意思呢,我刚开始也想得很绕,后面换个思路想,我把一串好好的链表123456,放到你这个方法里去,我放了一个1进去,你给我return出来个2,你啥意思嘞,1不就被吃了吗·1,那else那边啥意思呢,就是第一个next就是指向,加入上一个递归的if那边成立了,导致被吃了,那你next不就只能指向被吃下面的那一位吗,然后因为我没被吃,所以我return自己