力扣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<n;i++){//这里稳妥些需要判断p是否指到null了,但是测试用例都是合法的,我就懒得写了
            if(p){
				p=p.next;
			}else{//情况3:n大于链表长,输入就不合法
				return null;
			}
        }
		//情况4:n等于链表长度
        if(p==null){//说明n==length,要删除第一个节点
            return pre.next;
        }
        while(p.next!=null){
            p=p.next;
            pre=pre.next;
        }
        pre.next=pre.next.next;
        return head;
    }
}
posted @ 2022-03-03 21:46  荧惑微光  阅读(34)  评论(0编辑  收藏  举报