[LintCode]166.链表倒数第n个节点

来源:互联网 发布:石家庄整站优化 编辑:程序博客网 时间:2024/06/02 08:22

找到单链表倒数第n个节点,保证链表中节点的最少数量为n。

样例

给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.


一种是先遍历一遍单链表,计算链表的长度,然后再次遍历,直到到达节点数减去n的节点,返回结果。实际情况中若链表数目很多而n相对不大,这种方法需要大约两次遍历。

更简单的是采用双指针。快指针比慢指针提前n个单元。当快指针到达单链表尾部时,慢指针指向待删除节点的前节点。


双指针方法可以解决很多问题,比如上一个求单链表是否有环,也是使用两个指针,一个进一步,一个进两,如果有环两指针就会相遇。

/** * Definition of ListNode * class ListNode { * public: *     int val; *     ListNode *next; *     ListNode(int val) { *         this->val = val; *         this->next = NULL; *     } * } */class Solution {public:    /**     * @param head: The first node of linked list.     * @param n: An integer.     * @return: Nth to last node of a singly linked list.      */    ListNode *nthToLast(ListNode *head, int n) {        if(head==NULL||n==0){            return NULL;        }        ListNode *p=head;        ListNode *pre=head;                while(--n){            if(p->next==NULL){                return NULL;            }else{                p=p->next;            }        }                while(p->next){            p=p->next;            pre=pre->next;        }        return pre;        }};


原创粉丝点击