【LeetCode】Remove Nth Node From End of List(删除链表的倒数第N个节点)

这道题是LeetCode里的第19道题。

题目要求:

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

示例:

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

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

说明:

给定的 n 保证是有效的。

进阶:

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

先求链表长度的暴力法我就不讲了。

关于一趟实现的办法就是先让 back 先走 n 次,此时 front 和 back 产生了长度为 n 的间隔。然后我们再根据 back 是否为空,分为两种情况:

1.如果为空:则说明要删除的是头节点

2.如果不为空,我们就继续执行操作:此时我们让 back 和 front 同时移动,back 和 front 始终间隔 n,当 back 走向最后一个节点时,即满足 back.next = null,此时 front 正好在倒数 n+1 的节点位置上,最后用我们的 p = front.next,front.next = p.next,就完成了。

解题代码:

/**
 * 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) {
        if(head==null||n==0)return null;
        ListNode back=head,front=head,p;
        for(int i=0;i<n;i++){
            back=back.next;
        }
        if(back==null){
            p=head;
            head=head.next;
            return head;
        }
        while(back.next!=null){
            back=back.next;
            front=front.next;
        }
        p=front.next;
        front.next=p.next;
        return head;
    }
}

提交结果:

个人总结:

经典的链表题,能理解过程的话就出其不意的简单。

posted @ 2019-03-24 15:16  1000sakura  阅读(76)  评论(0编辑  收藏  举报