cc150:实现一个算法从一个单链表中返回倒数第n个元素

来源:互联网 发布:男人眼中的女人味知乎 编辑:程序博客网 时间:2024/04/30 19:08


    实现一个算法从一个单链表中返回倒数第n个元素。


   解答

        这道题的考点在于我们怎么在一个单链表中找到倒数第n个元素? 由于是单链表,所以我们没办法从最后一个元素数起,然后数n个得到答案。 但这种最直观的思路显然是没错的,那我们有没有办法通过别的方式,从最后的元素数起数 n个来得到我们想要的答案呢。这个次序颠倒的思路可以让我们联想到一种数据结构:栈。
       我们如果遍历一遍单链表,将其中的元素压栈,然后再将元素一一出栈。那么, 第n个出栈
的元素就是我们想要的。那我们是不是需要显式地用栈这么一个结构来做这个问题呢?答案是否。看到栈,我们应当
 要想到递归,它是一种天然使用栈的方式。所以,第一种解决方案用递归,让栈自己帮我们从链表的最后一个元素数起。思路很简单,如果指向链表的指针还未空,就不断递归。当指针为空时开始退递归,这个过程n不断减1,直接等于1,即可把栈中当前的元素取出。
      递归的特点就是理解直接,代码短小。所以,很多递归代码看起来都很漂亮(不包括我这个 

哈,还用了两个全局变量,比较不美观)。

void findNthToLast1(node *head){    if(head==NULL) return;    findNthToLast1(head->next);    if(nn==1) pp = head;    --nn;}

       除了递归,这道题目还有别的方法还做吗? 答案

还是有。虽然我们没办法从单链表的最后一个元素往前数,但如果我们维护两个指针, 它们之间的距离为n。然后,我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变。那么,当第二个指针指到空时,第一个指针即为所求。很tricky的方法, 将这个问题很漂亮地解决了。


node* findNthToLast(node *head, int n) {if(head==NULL || n < 1) return NULL;node *p = head,*q = head;while(n > 0 && q){q = q->next;--n;}if(n > 0)    return NULL;while(q) {p = q->next;q = q->next;}return p;}


0 0