题目链接:删除链表的倒数第N个节点
这道题 很常规的思路就是 先拷贝两次头结点 然后一个先走N步 然后同时开始走,直到先走N步的节点为空后,就停止,此时另一个没提前走的节点的下一个就是要删除的节点。不过需要注意的是,我们需要单独处理链表只有1个的时候的情况,以及如果删除的是头结点该怎么处理。所以,处于对头结点处理的方便,我们选择创建两个哑节点,next指向头结点,请注意这里是因为对链表只有遍历操作,没有其他什么操作,所以可以两个互相不影响,只是找位置而已。所以见如下代码:
C#:
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int val=0, ListNode next=null) {* this.val = val;* this.next = next;* }* }*/
public class Solution {public ListNode RemoveNthFromEnd(ListNode head, int n) {if(head==null || head.next==null){return null;}ListNode dummyA = new ListNode(0); // 虚拟节点dummyA.next = head; // next指向头ListNode dummyB = new ListNode(0); dummyB.next = head;ListNode nodeA = dummyA; // 拷贝一次用于处理ListNode nodeB = dummyB;int index = 0;while(index<n){ // 先走N步nodeB = nodeB.next;index++;}while(nodeB!=null && nodeB.next!=null){nodeA = nodeA.next;nodeB = nodeB.next;}ListNode next = nodeA.next.next;nodeA.next = next;return dummyA.next;}
}