LeetCode Exercise 8: Remove Nth Node From End of List

来源:互联网 发布:java main启动spring 编辑:程序博客网 时间:2024/06/03 20:36

题名:Remove Nth Node From End of List

难度:Medium

题目描述:

题目分析:

如果不要求遍历次数是很简单的,可以遍历一次得到链表长度L,然后再一次遍历删除第L-n+1个节点。

现在我们考虑如何一次遍历删除倒数第n个节点。我们可以使用两个指针:begin和end,两个指针之间隔开n的距离。(这样如果end是尾节点,那么begin指向的就是目标节点的前一个节点,便于之后的删除操作)之后我们可以同时移动两个节点,直到end指针到达链表尾部。期间要注意end指针是否提前到达尾部,如果要删除的节点是第一个节点,begin指针不可能指向目标节点的前一个节点。处理链表问题要一直注意是否越界指向了NULL,对NULL进行了操作。


代码如下:

/** * 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) {       // 如果只有一个元素,直接返回NULL          if(head->next == NULL){            return NULL;        }        ListNode* begin = head;        ListNode* end = head;                //移动end指针,与begin拉开n个距离,使begin定位在要删除元素的前一个元素        int i;    //注意是否提前到达尾部,即在移动完n步之前到达尾部        for(i = 0; i < n && end->next != NULL; i++){            end = end->next;        }                       if(i != n){   //如果提前到达尾部,则要删除元素为第一个元素            *head = *(head->next);        }        else{                  //同时移动begin和end,直到end到达尾部            while(end->next != NULL){                begin = begin->next;                end = end->next;           }             //删除指定节点           begin->next = begin->next->next;         }                return head;    }};



阅读全文
0 0
原创粉丝点击