LCR 021. 删除链表的倒数第 N 个结点

这篇也是凑数的 ....

描述 : 

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

题目 :

LeetCode 删除链表的倒数第Nge节点 : 

LCR 021. 删除链表的倒数第 N 个结点

LCR 021. 删除链表的倒数第 N 个结点_第1张图片

LCR 021. 删除链表的倒数第 N 个结点_第2张图片

分析 :

首先创建一个虚拟节点(哨兵节点) , 虚拟节点下一节点指向头节点这样我们移动元素的时候比较方便 , 用快慢指针的方式slow节点和fast节点指向虚拟节点 , fast指针比倒数第n个元素多走一步流出删除的节点 , 这样slow.next = slow.next.next 就删除了倒数第n个节点最后返回newNode.next节点也就是head节点 但是直接返回head节点会有一点问题 , 这里有什么问题 ?小伙伴们自己思考一下 .

例子 : 1,2,3,4,5 删除倒数第2个元素

LCR 021. 删除链表的倒数第 N 个结点_第3张图片

LCR 021. 删除链表的倒数第 N 个结点_第4张图片

LCR 021. 删除链表的倒数第 N 个结点_第5张图片

例 : 1,2 删除倒数第一个元素

LCR 021. 删除链表的倒数第 N 个结点_第6张图片

解析 :

LeetCode

/**
 * 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) {
        ListNode newNode = new ListNode(-100);
        newNode.next = head;
        ListNode slow = newNode;
        ListNode fast = newNode;
        for(int i = 0;i<= n ;i++){
            fast = fast.next;
        } 
        while(fast != null){
            slow = slow.next;
            fast = fast.next;
        }
        slow.next = slow.next.next;
        return newNode.next;
    }
}

你可能感兴趣的:(算法村,链表,数据结构)