溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++實(shí)現(xiàn)移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)

發(fā)布時(shí)間:2021-07-13 13:36:14 來(lái)源:億速云 閱讀:119 作者:chen 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“C++實(shí)現(xiàn)移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++實(shí)現(xiàn)移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)”吧!

 Remove Nth Node From End of List 移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)

Given a linked list, remove the nth node from the end of list and return its head.

For example,

C++實(shí)現(xiàn)移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)

Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:
Given n will always be valid.
Try to do this in one pass.

這道題讓我們移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn),限定n一定是有效的,即n不會(huì)大于鏈表中的元素總數(shù)。還有題目要求一次遍歷解決問(wèn)題,那么就得想些比較巧妙的方法了。比如首先要考慮的時(shí),如何找到倒數(shù)第N個(gè)節(jié)點(diǎn),由于只允許一次遍歷,所以不能用一次完整的遍歷來(lái)統(tǒng)計(jì)鏈表中元素的個(gè)數(shù),而是遍歷到對(duì)應(yīng)位置就應(yīng)該移除了。那么就需要用兩個(gè)指針來(lái)幫助解題,pre 和 cur 指針。首先 cur 指針先向前走N步,如果此時(shí) cur 指向空,說(shuō)明N為鏈表的長(zhǎng)度,則需要移除的為首元素,那么此時(shí)返回 head->next 即可,如果 cur 存在,再繼續(xù)往下走,此時(shí) pre 指針也跟著走,直到 cur 為最后一個(gè)元素時(shí)停止,此時(shí) pre 指向要移除元素的前一個(gè)元素,再修改指針跳過(guò)需要移除的元素即可,參見(jiàn)代碼如下:

方式一:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (!head->next) return NULL;
        ListNode *pre = head, *cur = head;
        for (int i = 0; i < n; ++i) cur = cur->next;
        if (!cur) return head->next;
        while (cur->next) {
            cur = cur->next;
            pre = pre->next;
        }
        pre->next = pre->next->next;
        return head;
    }
};

方式二:

class Solution {
public:
    int getLength(ListNode* head) {
        int length = 0;
        while (head) {
            ++length;
            head = head->next;
        }
        return length;
    }

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode(0, head);
        int length = getLength(head);
        ListNode* cur = dummy;
        for (int i = 1; i < length - n + 1; ++i) {
            cur = cur->next;
        }
        cur->next = cur->next->next;
        ListNode* ans = dummy->next;
        delete dummy;
        return ans;
    }
};

感謝各位的閱讀,以上就是“C++實(shí)現(xiàn)移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C++實(shí)現(xiàn)移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI