Leetcode之删除链表的倒数第N个节点

问题描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

解法

双指针,当遍历指针前进n个时,后面一个指针指向头部,这样保证了当遍历指针到达尾部时,后面一个指针在倒数第n个上,但是因为我们需要的是倒数第n个指针的前一个指针。所以我们再多等一次。但是这个时候就会出现边界性的问题,如果倒数第n个指针是头指针的下一个指针,但我们此时还没有后一个指针(q.next= =null跳出),所以head.next=head.next.next(n= =0)(此时q就是head);如果仅有一个数,即删除头指针时,head=head.next(q.next== null,n > 0)。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode q=head;
        ListNode p=null;
        while(q.next!=null){
            if(n>0){
                q=q.next;
                n--;
            }else if(n==0){
               p=head;
               n--;
            }else{
                p=p.next;
                q=q.next;
            }
        } 
        
        if(n>0){
            head=head.next;
        }else if(n==0){
            head.next=head.next.next;
        }else{
            p.next=p.next.next;
        }
        return head;
    }
}

结果

posted @ 2020-09-20 17:12  小帆敲代码  阅读(108)  评论(0编辑  收藏  举报