力扣top100-19. 删除链表的倒数第 N 个结点-双指针


题目

链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]

准备:

题目其实很简单,但是要考虑很多边界条件,特例
所以重新写一个

算法选择-双指针

前面指针跟踪后面的,定位到倒数第n个位置

考虑:

1.链表null,
2.n值为0
3.n值大于链表长度
4.n等于链表长度
5.链表仅有一个节点且n=1(区别前面的不合法输入,这个输入合法但是结果特殊)

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
 public ListNode removeNthFromEnd(ListNode head, int n) {
 		//情况1:链表空
        if(head==null)return null;
		//情况5:链表长度为1.n==1
		if(head.next==null&&n==1)return null;
		//情况2:n为0
		if(n==0)return head;
        ListNode pre=head,p=head;
        for(int i=0;i