1. 程式人生 > >堅持堅持!用Java寫出刪除一個連結串列的倒數第N個節點,並返回頭節點(N總是可達的)

堅持堅持!用Java寫出刪除一個連結串列的倒數第N個節點,並返回頭節點(N總是可達的)

這個題目有個前提條件就是N總是可達的,所以直接省去了一種情況(N不可達時的情況)

思路:

資料結構裡面首先給定兩個指標p和q分別都指向這個連結串列的頭節點,然後若想求出這個連結串列的倒數第N個節點,方法就是先讓p向後挪N個位置,q不動。

因為N總是可達的,所以會有倆種情況,

1、這個連結串列就只有N個節點

2、這個連結串列有大於N個節點

如果是第一種情況,則需要刪除的倒數第N個節點就是頭結點,所以head=head.next;刪除頭結點;

如果是第二種情況,則p繼續向後挪動,q也緊跟著向後挪動,此時當p向後挪動到連結串列尾部時停止,此時q指的位置就是該連結串列的倒數第N個節點,所以q.next=q.next.next;即刪除了該節點,程式碼如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
      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;
    }
}