• 链表中倒数第K个节点


    题目描述:

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

    算法思想:

      这种题型应该见过的,一般只要的涉及倒数。我们就需要设置两个指针了。这道题我们需要设置两个指针,先让一个指针向前移动k-1个位置(保持两个指针之间的距离为k-1),然后让第二个指针指向头结点,之后让两个指针同时向后移动,直到前边的指针指向NULL ,返回后边的指针即可。这样我们就扫描一遍的情况下找到了结果。

      针对这种方法我们还可以解决像求链表的中间节点,求单向链表是否有环等;我们的解决办法就是让一个指针速度快一些(比如一次走两步)或者先让他走若干步即可;

    算法实现:

     1 #include<iostream>
     2 #include<stdlib.h>
     3 using namespace std;
     4  
     5 typedef struct ListNode{
     6     int data;
     7     struct ListNode *next;
     8 }ListNode;
     9  
    10 ListNode *FindKey(ListNode *pHead, int k){
    11     if(pHead == NULL || k == 0){             //当输入的k<0或者头指针为空时,返回NULL
    12         return NULL;
    13     }
    14      
    15     ListNode *head = pHead;
    16     ListNode *index = NULL;
    17      
    18     for(int i = 0; i < k - 1; ++i){
    19         if(head->next != NULL){                  //当链表元素不足k个时,返回NULL
    20             head = head->next;
    21         }
    22         else{
    23             return NULL;
    24         }
    25     }
    26     index = pHead;
    27     while(head->next != NULL){
    28         head = head->next;
    29         index = index->next;
    30     }
    31     return index;
    32 }
    33  
    34 ListNode *CreateList(int x){                              //创建链表
    35     long num;
    36     ListNode *pHead = NULL;
    37     ListNode *p = NULL;
    38      
    39     while(x-- > 0){
    40             cin>>num;  
    41             ListNode* pNew = new ListNode();  
    42             if(pNew == NULL){
    43                     exit(EXIT_FAILURE);
    44                 }
    45             pNew->data = num;  
    46             pNew->next = NULL;  
    47         
    48             if(pHead == NULL)  
    49             {  
    50                 pHead = pNew;  
    51                 p = pHead;  
    52             }  
    53             else
    54             {  
    55                 p->next = pNew;  
    56                 p = p->next;  
    57             }   
    58         }
    59     return pHead; 
    60 } 
    61  
    62 int main(){
    63     int n, k;
    64     ListNode *result = NULL;
    65      
    66     while(cin>>n>>k){
    67         ListNode *pNode = CreateList(n);
    68         result = FindKey(pNode, k);
    69         if(result == NULL){
    70             cout<<"NULL"<<endl;
    71         }
    72         else{
    73             cout<<result->data<<endl;
    74         }
    75     }
    76      
    77     return 0;
    78 }
    79 /**************************************************************
    80     Problem: 1517
    81     User: 。。。。。。
    82     Language: C++
    83     Result: Accepted
    84     Time:190 ms
    85     Memory:3104 kb
    86 ****************************************************************

    参考书籍:

    《剑指offer》

  • 相关阅读:
    Azkaban3.81.x部署+坑
    MapReduce on Yarn运行原理
    伪分布式Spark + Hive on Spark搭建
    Hadoop版本升级(2.7.6 => 3.1.2)
    Hadoop运行原理总结(详细)
    Scala函数柯里化(Currying or Curry)
    ubuntu安装伪分布式Hadoop3.1.2
    ubuntu16.04安装mysql
    前端每日知识点分享(总结版)
    浅析 CSS 中的边距重叠
  • 原文地址:https://www.cnblogs.com/dormant/p/5330570.html
Copyright © 2020-2023  润新知