• [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.
    Note:
    Given n will always be valid.
    Try to do this in one pass.
    问题描述:给定一个链表,从链尾开始算起,删除第n个节点,并返回链表头。
    看到这题,我就想到了递归,因为不采用递归的话,就无法确定倒数第n个节点。采用递归,当遍历到链尾时就是0,最后一个节点就是1,依次类推。
    class Solution {
    public:
        int listLen(ListNode *head)
        {
            ListNode *p = head;
            int n = 0;
            while(p) {
                p = p->next;
                ++n;
            }
            
            return n;
        }
    
        int removenode(ListNode *head, int n)
        {
            if(head == NULL)
                return 0;
            int m = removenode(head->next, n) + 1;
            if(m == n + 1) {
                ListNode *p = head->next;
                head->next = p->next;
                free(p);
            }
            
            return m;
        }
    
        ListNode *removeNthFromEnd(ListNode *head, int n) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            int len = listLen(head);
            if(n == len) {
                ListNode *p = head;
                head = head->next;
                free(p);
            }
            
            removenode(head, n);
            
            return head;
        }
    };

    在上面的解法中,主要有两种n需要区分,当删除的节点是第一个节点时,和删除的节点不是第一个节点时,这是因为,我的removenode()函数删除的是参数后面的那个节点,当要删除的节点是第一个节点时,它没有前面的节点,因此要分开处理。
  • 相关阅读:
    Linux命令比较文件内容
    Linux命令jobs小记
    权限控制框架
    Log4j2源码分析系列:(一)配置加载
    Callable和Supplier的区别
    排序算法之归并排序
    Spring boot整合Mybatis
    排序算法之堆排序
    排序算法之希尔排序
    排序算法之快速排序
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3400317.html
Copyright © 2020-2023  润新知