19-删除链表的倒数第n个节点
这道题是一道链表的数据结构题,自从大一下以后几乎没用过链表来做题,手特别的生
要删除链表的倒数第n个节点,那么我们可以先算出该链表的总长度num,求出总长度后,倒数第n个就是顺着数的num = num-n+1个
那么我们再遍历一次,直到count==num,这个时候pre.next = cur.next就行了,达到了删除链表中某个元素的目的,相信在学c语言的数据结构时也做过(我大一时做过)
但是要注意的时假如删除的是第一个元素怎么办,我这里直接判断的,假如是第一个元素,那么p.next = pre.next,因为是第一个元素的话那么pre和cur此时都指的是第一个元素
然后返回p.next就行,代码如下:
不过这道题还有个进阶的版本,能否实现一次遍历完成?可以看到我的解法是两次for循环,遍历了两次,想了很久实在是没想出来还是只有卑微地看提示,提示说了双指针,第一个指针先走n步,第二个指针再走,这样当第一个指针走到底时,第二个指针的位置正好是倒数第n个数,好像叫做快慢指针。。不得不佩服。。
不过这里也要注意删除的是第一个元素的情况,不过现在简单了,当第一个指针走了n步后为nil,说明是删除的第一个元素,都不需要遍历链表就能文成,代码如下: