zoukankan      html  css  js  c++  java
  • 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.

    常规的解法,就是先轮训一次,计算其list的总长度len,再计算出需要要删除的index(len - n),但这需要两次循环。代码如下:

    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            int cnt = 0;
            ListNode* node = head;
            while (node) {
                ++cnt;
                node = node->next;
            }
     
            int index = cnt - n;
            if (0 == index) {
                head = head->next;
            } else {
                node = head;
                while (--index) {
                    node = node->next;
                }
                node->next = node->next->next;
            }
            return head;
        }
    };

    上面的解法中,要先计算出len,才能算出index。我们可以用另外一种方法来计算出index,先循环n次,让node自增。再新建一个指针slow指向head,之后再接着node和slow自增,node为空时,slow也就刚好到了要删除的点了。代码如下:

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode **slow = &head, *fast = head;    
        while (--n) fast = fast->next;
        while(fast->next) {
            slow = &((*slow)->next);
            fast = fast->next;
        }    
        *slow = (*slow)->next;    
        return head;
    }
  • 相关阅读:
    顺序栈用C语言实现
    对队列的操作和算法
    对链表的操作与算法
    对动态数组的操作与算法
    链表
    冒泡排序
    指针之动态分配内存
    字符串匹配KMP算法
    DS二叉树--层次遍历
    DS图--最小生成树
  • 原文地址:https://www.cnblogs.com/styshoo/p/4657860.html
Copyright © 2011-2022 走看看