給定一個鏈表,刪除鏈表中倒數第n個節點,返回鏈表的頭節點。
注意事項
鏈表中的節點個數大於等於n
給出鏈表1->2->3->4->5->null和 n = 2.
刪除倒數第二個節點之後,這個鏈表將變成1->2->3->5->null.
O(n)時間複雜度
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @param n: An integer.
* @return: The head of linked list.
*/
ListNode removeNthFromEnd(ListNode head, int n) {
// write your code here
ListNode p=head;
ListNode q=head;
for(int i=0;i<n;i++){
p=p.next;
}
if(p==null){
head=head.next;
return head;
}
while(p.next!=null){
p=p.next;
q=q.next;
}
q.next=q.next.next;
return head;
}
}
思路很簡單,只有兩種出現的情況,1、鏈表的長度剛剛好等於n,也就是說刪除表頭節點,2、鏈表長度大於n,那麼我們先定義兩個表頭,一個後移n位,然後兩個鏈表同時後移
,這時當後面的節點到達尾部時,前面的節點就是刪除的節點的前一個節點。