美文网首页我爱编程
Leetcode-19Remove Nth Node From

Leetcode-19Remove Nth Node From

作者: LdpcII | 来源:发表于2018-04-11 18:47 被阅读0次

    19. 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.
    Note:
    Given n will always be valid.
    Try to do this in one pass.

    移除链表中倒数第n个节点;

    写一个函数来确定要删除的是第几个节点,方法是获取链表总长度len,那么我们要删除的就是第 nth = len - n 个节点;
    知道了要删除的节点是第几个以后,我们只需要在指针head指向待删除节点的前一个节点地址时,将指针的next指向next的next地址就可以了:
    即:head->next = head->next->next;
    好了,思路确定好了以后我们来分析下边界值

    1. 当待删除的节点是第一个节点时(n = len):
      待删除节点不存在前一个节点,我们只需要返回头指针的 next ;
      即:return head->next;
    2. 当不删除节点时(n = 0):
      不存在待删除节点,也就没有 head->next->next;直接返回head即可;

    My Solution(C/C++完整实现):

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    int getNthFromHead(ListNode *head, int n) {
        int len = 0;
        while (head) {
            len += 1;
            head = head->next;
        }
        return len - n;
    }
    
    class Solution {
    public:
        ListNode *removeNthFromEnd(ListNode *head, int n) {
            ListNode *result = head;
            if (n == 0) {
                return result;
            }
            int nth = getNthFromHead(head, n);
            if (nth == 0) {
                return result->next;
            }
            while (nth - 1) {
                head = head->next;
            nth -= 1;
            }
            head->next = head->next->next;
            return result;
        }
    };
    
    int main() {
        ListNode a(1);
        ListNode b(2);
        ListNode c(3);
        ListNode d(4);
        ListNode e(5);
        ListNode f(6);
        ListNode g(7);
        a.next = &b;
        b.next = &c;
        c.next = &d;
        d.next = &e;
        e.next = &f;
        f.next = &g;
        Solution s;
        ListNode *result = s.removeNthFromEnd(&a, 3);
        while (result) {
            printf("%d->", result->val);
            result = result->next;
        }
        return 0;
    }
    

    结果:

    1->2->3->4->6->7->
    

    My Solution:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def removeNthFromEnd(self, head, n):
            """
            :type head: ListNode
            :type n: int
            :rtype: ListNode
            """
            l = head
            num = self.getNumFromHead(head, n)
            if num == 0:
                return l.next
            nth = 0
            while head:
                nth += 1
                if nth == num:
                    next = head.next
                    head.next = next.next
                    return l
                head = head.next
                     
        def getNumFromHead(self, head, n):
            num = 0
            while head:
                num += 1
                head = head.next
            return num - n
    
    

    相关文章

      网友评论

        本文标题:Leetcode-19Remove Nth Node From

        本文链接:https://www.haomeiwen.com/subject/pkmzhftx.html