题解 | #删除链表的倒数第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; } }//另:如果使用修改下一个节点指针的方式剔除目标节点,会比重新生成一个新链表更有效率