leetcode题目例题解析(四)

leetcode题目例题解析(四)

Remove Nth Node From End of List

题目描述:

Given a linked list, remove the nth node from the end of list and return its head.
For example,
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.

题意解析:

这道题题目描述的很清楚,就是删除掉倒数第n个节点(n从1开始),所以开始想到的是先遍历一遍,算出链表的长度,然后再第二遍删除特定的位置,但是,题目有一个小提示,就是尽量用一遍就完成,也就是再不知道链表的长度的情况下,删除倒数的第n个节点。

解题思路:

通过两次遍历的方式是最简单的,但是并不是最高效的,因为要便利两边数组,仔细想想如何通过一次遍历就实现呢? 其实这也是能够实现的,这里我们要知道,倒数第n个,也就是说跟最后一个相差n-1个,所以,我们可以通过利用这个差值,我们设定两个迭代器,一个遍历,另外一个在其前面第n个,然后跟迭代器一起增加,当迭代器遍历到结尾时,另外一个就到了我们要删除的那个了。
代码:

/**
 * 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* loop = head;
        int count = 0;
        while (count < n) {
            loop = loop->next;
            count++;
        }
        //这里要注意,如果删除的是头部,拿出来特别处理一下
        if (loop == NULL) {
            ListNode* temp = head->next;
            delete head;//避免memory leak
            return temp;
        }
        ListNode* target = head;//这里要一直指向我们要删除的前一个
        while (loop->next) {
            target = target->next;
            loop = loop->next;
        }
        ListNode* todelete = target->next;
        target->next = target->next->next;
        delete todelete;
        return head;
    }
};

原题目链接:
https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/

猜你喜欢

转载自blog.csdn.net/OzhangsenO/article/details/78058488