1. 程式人生 > >LeetCode 19. 刪除連結串列的倒數第N個節點(Remove Nth Node From End Of List)

LeetCode 19. 刪除連結串列的倒數第N個節點(Remove Nth Node From End Of List)

題目描述

給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.

說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現嗎?

解題思路

連結串列結構: (頭節點)1->2->3->4->5->NULL 典型的利用典型的利用雙指標法解題。定義兩個指標,剛開始分別指向頭結點,然後先讓一個指標first先走n步,接著讓指標second指向頭結點,並和first一起向後移動。當first的next指標為NULL時,second即指向了要刪除節點的前一個節點,接著讓first指向的next指標指向要刪除節點的下一個節點即可。

注意: 如果要刪除的節點是首節點,那麼first向後移動結束時會為NULL,這樣加一個判斷其是否為NULL的條件,若為NULL則返回頭結點的next指標。

程式碼展示

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode*
head, int n) { ListNode* first=head; while(n--!=0){ first=first->next; } if(!first){ return head->next; } ListNode* second=head; while(first->next!=NULL){ first=first->next; second=second->
next; } second->next=second->next->next; return head; } };