zoukankan      html  css  js  c++  java
  • [Jobdu] 题目1517:链表中倒数第k个结点

    给出一个链表的头指针,要求找到倒数第k个节点,并输出这个节点的值

    例子:

    先看一个例子,链表为:1 2 3 4 5 6,倒数第2个节点就是5,倒数第一个节点就是6,以此类推。这里的链表有头节点,就是说head->next才是指向第一个节点的。链表的数据结构如下:

    1 // ListNode
    2 typedef struct LNode {
    3     int key;
    4     struct LNode *next;
    5 }

    分析:

    我们现在只知道链表的头指针,而且链表的长度未知,那么怎么办?

    有一种方法可能会首先出现在我们的脑海中,就是先遍历链表,确定链表的长度length,然后倒数第k个节点就是,第(length - k + 1)个节点。当然这种方法可以解决问题,但是需要两次遍历链表,如果去面试,你这样回答面试官,那么这显然不是面试官想要的算法。那么有没有更好的能够一次遍历解决问题的方法呢?

    答案是肯定的

    1.  首先可以用p1,p2两个指针指向头节点:

    2.  然后先让p2向前移动k(k=2)个节点:

    3.  然后让p1,p2同时向前移动,当p2为空,即p2指向最后一节点的下一个节点(NULL)时,p1指向的节点就是倒数第个k个节点:

    代码:

     1 // find the last k-th node of list
     2 int findKey(LNode *head, int k) {
     3     LNode *p1 = head;
     4     LNode *p2 = head;
     5     
     6     // p2 move on k nodes
     7     while (k-- > 0)
     8         p2 = p2->next;
     9 
    10     // then p1 and p2 both move on until p2 == NULL
    11     while (p2) {
    12         p1 = p1->next;
    13         p2 = p2->next;
    14     }
    15     
    16     return p1->key;
    17 }
  • 相关阅读:
    hql语句
    eclipse部署jrebel热启动后报错java.lang.OutOfMemoryError: PermGen space问题
    jQuery冒泡事件
    oracle中使用序列生成编号
    月份-日期下拉框联动变换日期
    xml运用1
    Oracle 数据库 ORA-01034
    Spring中IOC&AOP
    使用可视化图表对 Webpack 2 的编译与打包进行统计分析
    数据驱动
  • 原文地址:https://www.cnblogs.com/tonyhu1993/p/4705786.html
Copyright © 2011-2022 走看看