題目描述指針
給定一個鏈表,刪除鏈表的倒數第 n 個節點,而且返回鏈表的頭結點。rem
示例:io
給定一個鏈表: 1->2->3->4->5, 和 n = 2.ast
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.class
說明:List
給定的 n 保證是有效的。進階
進階:遍歷
你能嘗試使用一趟掃描實現嗎?im
題目解析:鏈表
採用雙重遍歷確定是能夠解決問題的,可是題目要求咱們 一次遍歷解決問題,那咱們的思路得散發一下。
咱們能夠設想假設設定了雙指針p和q,當q指向末尾的NULL時,p和q之間相隔的元素個數爲n時,那麼刪除掉p的下一個指針就完成了要求。
1.設置虛擬節點dummyHead指向head
2.設定雙指針p和q,初始都指向虛擬節點dummyHead
3.移動q,直到p和q之間相隔的元素個數爲n
4.同時移動p與q,知道q指向的爲NULL
5.將p的下一個節點指向下下一個節點。
public class Solution3 {
public ListNode removeNthFromEnd(ListNode head, int n) {
//建立一個虛擬頭結點
ListNode dummy = new ListNode(-1);
dummy.next =head;
ListNode fast = dummy;
ListNode slow = dummy;
while(fast !=null && n>-1){
fast = fast.next; n--;
}
while(fast!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}