LeetCode每日一题,19. Remove Nth Node From End of LIst
先看题目描述
大意就是给定一个链表,再给定一个数字 n,让我们删除链表中的倒数第 n 个节点
算法和思路
如果是遍历两遍的话,代码很容易实现,先遍历一遍统计链表长度 len,再遍历一遍来删除正数第 len - n + 1 个节点
但题目要求只遍历一遍,那么就使用双指针法
双指针法
算法流程:
- 定义两个指针 p 和 q 指向链表的头节点 head
- 将 q 指针向后移动 n 位
- 同时向右移动 p 指针和 q 指针直至 q 指针为空,移动过程中用 pre 指针来指向 p 指针的前置节点
- 当 q 指针为空时,p 指针指向的节点就是要删除的节点
- 删除掉 p 指针指向节点并返回链表即可
注意:为了解决删除头节点的问题,可以定义一个哑节点 dumpy,令其 next 为 head 节点,初始化 pre 指针时使其指向 dumpy 节点,最终结果返回 dumpy.next
算法源码
两次遍历
1 | /** |
双指针
1 | /** |