題目鏈接:刪除鏈表的倒數第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;}
}