• 14、剑指offer--链表中倒数第k个结点


    题目描述
    输入一个链表,输出该链表中倒数第k个结点。
     
    解题思路:
    方法一:
    定义两个指针,一个指针先向前移动k-1步(在移动过程中判断是否越界)
    第二个指针指向头,然后两个指针同时向前移动,第一个指针指向最后一个节点的时候,第二个指针指向第k个结点
     
    方法二:先全部遍历一遍,找到链表中结点数目,然后进行k和结点数目length的比较,把特殊错误的情况处理出来,然后再用一中的方法用两个指针,找到倒数第k个结点。
      1 #include <iostream>
      2 #include <malloc.h>
      3 using namespace std;
      4 struct ListNode {
      5     int val;
      6     struct ListNode *next;
      7     ListNode(int x) :
      8             val(x), next(NULL) {
      9     }
     10 };
     11 ListNode *CreateList(int n)
     12 {
     13     ListNode *head;
     14     ListNode *p,*pre;
     15     int i;
     16     head=(ListNode *)malloc(sizeof(ListNode));
     17     head->next=NULL;
     18     pre=head;
     19     for(i=1;i<=n;i++)
     20     {
     21         p=(ListNode *)malloc(sizeof(ListNode));
     22         cin>>p->val;
     23         pre->next=p;
     24         pre=p;
     25     }
     26     p->next=NULL;
     27 
     28     return head->next;
     29 }
     30 /*-------------------------输出链表-----------------------------------*/
     31 void PrintList(ListNode *h)
     32 {
     33     ListNode *p;
     34 
     35     p=h;//不带空的头结点
     36     while(p)
     37     {
     38         cout<<p->val<<" ";
     39         p=p->next;
     40         cout<<endl;
     41     }
     42 }
     43 class Solution {
     44 public:
     45     ListNode* FindKthToTail1(ListNode* pListHead, unsigned int k) {
     46         if(pListHead == NULL || k == 0)
     47             return NULL;
     48         ListNode *pHead = pListHead;
     49         ListNode *pBehind = NULL;
     50         for(int i=0;i<k-1;i++)
     51         {
     52             if(pHead->next!=NULL)
     53             {
     54                 pHead = pHead->next;
     55             }
     56             else
     57             {
     58                 return NULL;
     59             }
     60         }
     61         pBehind = pListHead;//当pHead指向链表第k-1和节点是,pBehind指向链表的头
     62         while(pHead->next!=NULL)
     63         {
     64             pHead = pHead->next;
     65             pBehind = pBehind->next;
     66         }
     67         return pBehind;
     68     }
     69     ListNode* FindKthToTail2(ListNode* pListHead, unsigned int k) {
     70         if(pListHead == NULL || k<=0)
     71             return NULL;
     72         int length = 0;
     73         ListNode *pNode = pListHead;
     74         while(pNode != NULL)
     75         {
     76             pNode = pNode->next;
     77             length++;
     78         }
     79         if(k == length)
     80             return pListHead;
     81         else if(k>length)
     82             return NULL;
     83         else//取k%length
     84         {
     85             ListNode *p1 = pListHead;
     86             ListNode *p2 = pListHead;
     87             for(int i=0;i<(k-1)%length;i++)
     88             {
     89                 p2 = p2->next;
     90             }
     91             while(p2->next != NULL)
     92             {
     93                 p1 = p1->next;
     94                 p2 = p2->next;
     95             }
     96             return p1;
     97         }
     98 
     99     }
    100 };
    101 int main()
    102 {
    103     int n1;
    104     int k;
    105     ListNode *h1;
    106     cout<<"输入链表1的结点数目"<<endl;
    107     cin>>n1;
    108     h1 = CreateList(n1);
    109     cout<<"链表1为:"<<endl;
    110     PrintList(h1);
    111     cout<<"输入需要的k"<<endl;
    112     cin>>k;
    113     Solution s;
    114     cout<<"方法一:倒数第"<<k<<"个结点的值为"<<endl;
    115     cout<<s.FindKthToTail1(h1,k)->val<<endl;
    116     cout<<"方法二:倒数第"<<k<<"个结点的值为"<<endl;
    117     cout<<s.FindKthToTail2(h1,k)->val<<endl;
    118     return 0;
    119 }

  • 相关阅读:
    VirtualBox下Ubuntu更改分辨率方法
    Asp.Net防止刷新重复提交数据小记
    耻辱名单新成员,腾讯QQ影音违反开源协议遭谴责
    赛门铁克BERS 2010新增Linux备份还原
    开源邮件服务解决方案 iRedMail0.6.0beta1 发布,支持 FreeBSD
    防止ASP.NET按钮多次提交代码
    与省局网站备案管理系统接口规范试行版文件下载地址
    2010预测:开源ERP难有大作为
    ASP.NET对IIS中的虚拟目录进行操作
    C#三种模拟自动登录和提交POST信息的实现方法
  • 原文地址:https://www.cnblogs.com/qqky/p/6858438.html
Copyright © 2020-2023  润新知