【链表】删除链表的倒数第N个节点

原题: 删除链表倒数第N个节点

第一种解法:
本文适用于初学者。它介绍了以下内容:链表的遍历和删除其末尾的第 n 个元素。

/**
 * 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) {
        
        int length = 0;
        ListNode curr = head;
        while(curr.next != null){
             curr = curr.next;
             length++; 
        }
        //获得长度以后,我们知道下一步我们根据n个节点来看待的话其实就是删除掉长度为length-n的节点就可以了,因为下标从0开始的
        length = length - n ;
        //用当前的节点遍历并到了0的时候退出循环,去掉next值
        curr = head;
        while(length > 0){
           curr = curr.next;
           length--; 
        }
        //去掉中间第n个值
        curr.next = curr.next.next;
        //由于都是对象的引用所以原先的对象会持有对象引用
        return head;
        
}
}

第二种解决方案:双指针解决方案

/**
 * 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 begin = new ListNode(0);
    begin.next = head;
        //只用一个循环实现
        ListNode fNode = begin;
        ListNode bNode = begin;
        while(fNode.next != null)
        {
            //前n步不做处理因为相差n步可以理解为相对运动也就是说
            if(n > 0){
              fNode = fNode.next;
              //保证走n步
              n--;
            }else{
                fNode = fNode.next;
                //以后开始继续走了,那么当fNode.next =null的时候为最后的尾节点,这个时候的pointerB所指向的那个bNode节点则是倒数第n个节点。
                bNode = bNode.next;
            }
            
            
        }
        bNode.next = bNode.next.next;
        return begin.next;
        
}
}
发布了213 篇原创文章 · 获赞 258 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/wolf_love666/article/details/95169651