1、题目描述
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
2、算法分析
① 定义四个指针。第一个指针start是指向链表第一个结点的。第二个指针指向pre指向start,第三个current指针指向head,第四个指针fast指向的是head。
② fast指针继续往前走,直到指向的是链表的第n个结点,此时current,fast结点同事继续往前走,直到fast走到最后一个结点,然后停止。此时current的结点就是倒数第n个结点。说白了就是先计算长度。然后倒叙再反过来计算倒叙的。
OK,看代码了。
3、代码实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 定义一个指针start指向头结点
ListNode start = new ListNode(-1);
start.next = head;
// 定义当前结点的前一个结点指针
ListNode pre = start;
// 定义指针指向当前结点
ListNode current = head;
// 定义往前跑的指针
ListNode fast = head;
// 计算长度
for(int i = 0;i < n;i++){
fast = fast.next;
}
// 找到长度后,其余的指针一起往前走
while(fast != null){
pre = pre.next;
current = current.next;
fast = fast.next;
}
// current指向的是当前结点,删除当前结点。
// 使用当前结点的前一个指针指向的是当前结点下一个结点的位置
pre.next = current.next;
// 返回的是链表的第一个节点。
return start.next;
}
}
4、总结
求倒数第几个结点,定指针,求长度,指针后移动。