題目要求:去掉linked list的倒數第n個節點
list:1->2->3->4->5 ,n=2,在去掉倒數第二個節點之後,變爲1->2->3->5 。(n永遠合法,且list最多過一趟)。
tags:linked list,two pointers ,fast&slow pointers
思路:
1.linked list一般設計一個僞頭(preHead),讓preHead指向真正的head,這樣給出的真正的head可以像list中的其他元素一樣進行判斷,減少了對頭元素狀態的判斷。
2.在這道題目裏,由於要求在一趟就去掉距離尾部距離爲n的節點,所以比較適合使用快慢指針,當快指針指向隊尾的時候,慢指針指向距離隊尾距離爲n的節點,去掉該節點即可。
//其實剛開始可以將fast.next和slow.next都指向head
//再將fast指針和slow指針距離擴大到n
//當fast.next指向空的時候(達到隊尾),slow達到了倒數第n+1個節點
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = new ListNode(0);
ListNode slow = new ListNode(0);
fast.next = slow;
slow.next = head;
for(int i=0;i<n;i++){
head = head.next;
}
while(head!=null){
head = head.next;
slow = slow.next;
}
slow.next = slow.next.next;
return fast.next.next;
}