【力扣LeetCode】19 刪除鏈表的倒數第N個節點

題目描述(難度中)

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

示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.

說明:

給定的 n 保證是有效的。

進階:

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

鏈接

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

思路

用一前一後兩個指針,第一個指針先跑nnode,第二個指針再從頭跑,第一個指針跑到結尾時,第二個指針指向的node即爲要刪除的node
注意:
1、輸入的鏈表沒有nnode時,返回NULL
2、要刪除的node是第一個node時,返回爲head->next,這種情況需要特判
3、需要用一個指針記錄指向要刪除node的上一個node

代碼

代碼沒有釋放p2指向的內存空間,因爲使用deletefree都會編譯出錯,實際操作中是需要釋放的。

/**
 * 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* p1 = head;
        ListNode* p2 = head;
        ListNode* p2pre = head;
        // p1 先向前跑n下
		while(n--){
			if(p1){
				p1 = p1->next;
			}
			else{
				return NULL;
			}
		} 
		// 刪除的是第一個node時的特判
		if(p1 == NULL){
			return head->next;
		}
		while(p1){
			p1 = p1->next;
			p2pre = p2;
			p2 = p2->next;
		}
		p2pre->next = p2->next;
        return head;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章