zoukankan      html  css  js  c++  java
  • 输入一个链表,输出该链表中倒数第k个结点

    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };

    输入一个链表,输出该链表中倒数第k个结点

    第一种方法:定义两个结点指针p1,p2指向该链表的头结点,然后利用p1遍历整个链表,记下长度n;然后再利用p2往后遍历n-k个结点即可,因为p2已经指向了头结点。

      
     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *ptr = pListHead;//遍历指针
        ListNode *ptr1 = pListHead;//返回指针
        if (pListHead == NULL || k == 0)
            return NULL;
        int n = 1;//已经指向第一个结点
        while (ptr->next != NULL){
            ptr=ptr->next;
            n++;
        }
        if(n<k)
            return NULL;
        for (int i = 0; i < n - k; ++i)
            ptr1 = ptr1->next;
        return ptr1;
        }
     
    第二种方法:定义两个结点指针p1,p2指向该链表的头部,然后p1先遍历k-1个结点,然后p1和p2同时遍历。返回p2.
      
     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *p1 = pListHead;
        ListNode *p2 = pListHead;
        if (pListHead == NULL || k == 0)
            return NULL;
        for (int i = 0; i < k - 1; ++i){
            if (p1->next != NULL)
                p1 = p1->next;
            else
                return NULL;  //还没到第k个就到尾了,及K>链表长度。
        }
        while (p1->next != NULL){
            p1=p1->next;
            p2 = p2->next;
        }
        return p2;
     
    两个程序在网上都编译通过
    总结:当链表比较小时,第一种方法是很有效的,但是链表比较大时,就有点浪费了,而第二种方法都合适,故可以多多考虑第二种方法
  • 相关阅读:
    事件
    js定时器
    js动画
    oop面向对象编程
    26 正则表达式
    25 异常处理
    javascript操作select的一些基本方法总结
    一个select 列子的思考
    jquery中 toggleClass方法的一种用法
    模拟TAB 采用 attachEvent 遇到的IE兼容问题
  • 原文地址:https://www.cnblogs.com/jlxuexijidi-2015/p/4887552.html
Copyright © 2011-2022 走看看