[LeetCode题解]19. 删除链表的倒数第N个节点 | 双指针 + 一次遍历

解题思路

双指针:第一个指针先走 n 步,然后两个指针同时走。

这里要注意当链表长度<=n,要删除头节点。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */
public class Solution {
    public ListNode RemoveNthFromEnd(ListNode head, int n) {
        // 双指针:第一个指针先走 n 步,然后两个指针同时走
        if(head == null) {
            return head;
        }

        ListNode p = head;
        for(int i = 1; i <= n; i++) {
            if(p == null) {
                break;
            }
            p = p.next;
        }

        if(p == null) { // 不足够或刚好 n 个节点,删除头节点 
            return head.next;
        }

        // 第二步:两个指针同时走,直到走到最后
        ListNode q = head, pre = null;
        while(p != null) {
            p = p.next;
            pre = q;
            q = q.next;
        }

        pre.next = q.next;

        return head;
    }
}

复杂度分析

  • 时间复杂度:\(O(n)\),其中 \(n\) 是链表的长度。一次遍历,时间复杂度为 \(O(n)\)
  • 空间复杂度:\(O(1)\)
posted @ 2020-11-20 22:37  大杂草  阅读(203)  评论(0编辑  收藏  举报