题目:分别实现两个函数,分别删除单链表和双链表的倒数第K个节点。
如果链表长度为N,要求时间复杂度达到O(N),额外空间复杂度达到O(N)。
实现
单链表:
- 若单链表长度为空或K小于1,参数无效,直接返回(若设返回参数为Node,则不能直接return,需要加个返回参数,返回头节点,return head)。
- 从头到尾遍历链表,每走一步,K的值就减1。当链表走到尾,
1)如果K >0,则不存在倒数第K个节点;
2)如果K=0,则头结点就是倒数第K个节点,删除头节点(即直接返回head.next,让第二个节点成为头节点);
3)如果k<0,说明倒数第K个节点处在链表中间的某一位置: - 则重头开始走,每走一步,K加1,当K=0的位置,是需要删除的节点的前一个节点。
1 | //单链表的Node类 |
1 | public class RemoveLastKthNode { |
另一种方法:
- 设置快慢指针,快指针比慢指针先走k步。
- 当快指针走到最后一个节点,慢指针指向要删除节点的前一个节点。
1 | /** |
双链表:
与单链表的实现类似,只不过它的Node类中多了前向指针。
1 | //双链表的Node类 |
1 | /** |
1 | //Test |