删除链表的倒数第N个节点--leetcode刷题

题目

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

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

思路

不需要去遍历两次,一次即可,思路是,用两个指针p,q先指向头节点,让q指针走到第n个位置,然后两个指针同时往后走,走到q.next==null是说明p已经到达倒数第n个节点的前面的那个节点,此时删除下一个节点即可。

注意:当删除头节点和只有一个元素的情况。

代码

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null){
            return head;
        }
        ListNode q = head;
        ListNode p = head;
        //用count记录走了多少步,和最终链表的长度
        int count = 0;
        while(q.next != null){
            count++;
            //前n步只让q指针走
            if(count<=n){
                q=q.next;
            }else{
                q=q.next;
                p=p.next;
            }
        }
        //循环结束时p到达了倒数n个元素的前面一个元素
        //两个特殊情况,即链表只有一个元素和要删除的为头节点的情况
        if(head.next ==null || count+1 == n){
            head = head.next;
        }else{
            p.next = p.next.next;
        }
        return head;
    }
}

标签: none