zoukankan      html  css  js  c++  java
  • 剑指Offer-链表中倒数第k个结点

    题目:

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

    思路1:

    1. 使用指针遍历链表,得到链表的长度len;
    2. 将指针指向链表头部,向后移动len-k+1个长度,得到倒数第k个节点。

    代码1:

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6             val(x), next(NULL) {
     7     }
     8 };*/
     9 class Solution {
    10 public:
    11     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    12         ListNode *newphead = pListHead;
    13         int total = 0;
    14         while(newphead != NULL){
    15             total++;
    16             newphead = newphead->next;
    17         }
    18         newphead = pListHead;
    19         int flag = total-k+1;
    20         total = 0;
    21         ListNode *result;
    22         while(newphead != NULL){
    23             total++;
    24             if(total == flag){
    25                 result = newphead;
    26                 break;
    27             }
    28             newphead = newphead->next;
    29         }
    30         return result;
    31     }
    32 };
    View Code

    思路2:

    1. 使用两个指针,第一个指针向前移动k-1个节点,到达第k个节点;
    2. 第二个指针和第一个指针同时开始移动,当第一个指针到达链表末尾时,第二个指针位于倒数第k个节点上。

    代码2:

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6             val(x), next(NULL) {
     7     }
     8 };*/
     9 class Solution {
    10 public:
    11     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    12         if(pListHead == NULL )
    13             return pListHead;
    14         ListNode *p1 = pListHead;
    15         ListNode *p2 = pListHead;
    16         int step = 1;
    17         while(step <= k){
    18             if(p1->next != NULL)
    19                 p1 = p1->next;
    20             else{
    21                 if(step == k)
    22                     return p2;
    23                 else
    24                     return NULL;
    25             }
    26             step += 1;
    27         }
    28         while(p1 != NULL){
    29             p1 = p1->next;
    30             p2 = p2->next;
    31         }
    32         return p2;
    33     }
    34 };
    View Code
  • 相关阅读:
    关于对话框创建与销毁的虚函数用法
    控件属性设置注意事项
    删除非空文件夹下所有内容方法
    CString类使用技巧
    视图间通信方法
    CTreeCtrl控件使用技巧
    MFC MDI 遍历打开的所有文档
    将datagrid的数据源到出导excel
    ASP.NET 給一組控件賦值 範例.
    ASP.NET Resouce Kit
  • 原文地址:https://www.cnblogs.com/sindy/p/7387708.html
Copyright © 2011-2022 走看看