题解 | #删除链表的倒数第n个节点#

删除链表的倒数第n个节点

https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6

using System;
using System.Collections.Generic;

/*
public class ListNode
{
	public int val;
	public ListNode next;

	public ListNode (int x)
	{
		val = x;
	}
}
*/

class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode removeNthFromEnd (ListNode head, int n) {
        // write code here
        List<int> values = new List<int>();
        do
        {
            values.Add(head.val);
            head = head.next;
        }while(head  != null);//该循环将链表中的数据从头到尾依次提取到一个List的实例中
        
        if(values.Count == 1)//如果链表中仅有一个节点,删除任意节点后必然为空
        {
            return null;
        }
        values.RemoveAt(values.Count - n);//移除倒数第n个节点
        if(values.Count == 1)//如果移除目标节点后values中仅剩一个元素,则直接将其存入节点并返回
        {
            ListNode r = new ListNode(values[0]);
            return r;
        }
        ListNode tail = new ListNode(values[values.Count-1]);
        tail.next = null;//设置尾节点
        for(int i = values.Count-2;i>=0;i--)//从后往前遍历values中末尾元素之外的其他元素
        {
            ListNode buffer = new ListNode(values[i]);
            buffer.next = tail;
            tail = buffer;//设置前一个节点
        }//该循环结束后,tail就成了结果的头节点
        return tail;        
    }
}//另:如果使用修改下一个节点指针的方式剔除目标节点,会比重新生成一个新链表更有效率

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务