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 }

原文地址:https://www.cnblogs.com/qqky/p/6858438.html