.从列表结束中删除第N个节点

描述

给定一个链表,从列表的最后删除倒数第n个元素

例如:

  给定链表:1-> 2-> 3-> 4-> 5,并且n = 2。

  删除倒数第二个,链表将变为1-> 2-> 3-> 5。

链表定义:

 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

我的方法

public ListNode removeNthFromEnd(ListNode head, int n) {
        if(n==0) return head;
        int len=0;
        ListNode temp = head;
        //检测出链表长度
        while(temp.next != null){
            len++;
            temp = temp.next;
        }
        
        //如果要取出的是链表头,那么直接返回链表下一个引用
        if(len-n+1 == 0) return head.next;
        
        //特殊情况:当要去掉的是末尾元素时
        if(n==1){
        	//特殊情况中的特殊情况:当链表只有一项,且要取出的是结尾元素,那么就相当于清空链表,返回控制内即可
            if(len==0){
                return null;
            }
            //当链表长度>1时
            int i=0;
            temp = head;
            while(i<len-1){
                i++;
                temp = temp.next;
            }
            temp.next = null;
            return head;
        }
        
        //一般状况
        //找到要跳过的那个元素的前一个元素,让这个元素的指针指向下一个的下一个元素:temp.next.next
        int i=0;
        temp = head;
        while(i < len-n){
            temp = temp.next;
            i++;
        }
        temp.next = temp.next.next;
        return head;
    }

leetcode讨论区的方法

public ListNode removeNthFromEnd1(ListNode head, int n) {
	    
	    ListNode start = new ListNode(0);
	    ListNode slow = start, fast = start;
	    slow.next = head;
	    
	    //移动快指针,让快指针与慢指针的距离为n,即慢指针落后n+1位此时慢指针的next还是head
	    for(int i=1; i<=n+1; i++)   {
	        fast = fast.next;
	    }
	    //同时移动快慢指针,当快指针到达最后时,慢指针指向的正好是要跳过的节点的父节点
	    while(fast != null) {
	        slow = slow.next;
	        fast = fast.next;
	    }
	    //跳过这个节点
	    slow.next = slow.next.next;
	    return start.next;
	}

  

原文地址:https://www.cnblogs.com/K-artorias/p/7928304.html