题目:输入一个链表,输出该链表的倒数第K个结点。为了符合大多数人的习惯,本题

从1开始计数,即链表的尾结点是倒数第1个节点。例如有一个链表有6个节点,从

头节点开始他们的值依次是1,2,3,4,5,6.这个链表的倒数第三个节点是值为4的节点。

这个题目常规情况下我们都是考虑先从链表的头遍历到链表的尾,然后后退k步取倒数第

k个节点的值。

然而我们也可以这样考虑先遍历一遍链表计算出链表的长度N,要取出倒数的第k个,其实就是

从链表头走N-k+1步便到了倒数第k个节点,但是这种方式似乎并没有什么改进。

然而我们可以举这样一个例子3->2->4->5->9->6我们要取出倒数第三个元素即值为5的元素

我们可以设置两个指针ptr1和ptr2这两个指针开始都指向3,然后ptr1向后移动k-1步即移动到第四

个元素的位置。这时候ptr1和ptr2再同时移动知道ptr1指向最后一个元素,这时候ptr正好指向5

两个指向之间相差正好k-1个元素。

代码实现如下:

 #include <iostream>
#include <stack>
using namespace std; struct ListNode
{
int data;
struct ListNode *next;
}; struct ListNode* CreateList()
{
struct ListNode* Head,*p;
Head=(struct ListNode*)malloc(sizeof(ListNode));
Head->data=;
Head->next=NULL;
p=Head; cout<<"Create List....(0-exit!)"<<endl;
while(true)
{
int Data;
cin>>Data;
if(Data!=)
{
struct ListNode* NewNode;
NewNode=(struct ListNode*)malloc(sizeof(ListNode));
NewNode->data=Data;
NewNode->next=NULL;
p->next=NewNode;
p=p->next;
}
else
{
break;
}
} return Head->next;
} void PrintList(struct ListNode* Head)
{
cout<<"The List is: "; struct ListNode *p;
p=Head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
} ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)
{
ListNode *ptr1,*ptr2;
ptr1=pListHead;
ptr2=pListHead; if(pListHead==NULL||k==0)
return NULL; int count=;
/* while(count<=(k-))
{
ptr1=ptr1->next;
count++;
}*/     //未考虑到当k大于链表本身的长度
    改:
    while(count<=(k-1))
    {
if(ptr1->next==NULL)
      {
return NULL;
}
else
{
       ptr1=ptr1->next;
        count++;
      }
} while(ptr1!=NULL)
{
ptr1=ptr1->next;
ptr2=ptr2->next;
} return ptr2;
} int main()
{
ListNode *Head;
Head=CreateList();
PrintList(Head);
if(FindKthToTail(Head,))
{
cout<<"Last K value in List is: "<<FindKthToTail(Head,)->data<<endl;
}
return ;
}

运行截图:

剑指offer-面试题15.链表中倒数第k个结点的更多相关文章

  1. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  2. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  3. 剑指offer十四之链表中倒数第k个结点

    一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...

  4. 【剑指Offer】14、链表中倒数第k个结点

      题目描述:   输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6. ...

  5. 剑指offer【13】- 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...

  6. 面试题 15:链表中倒数第 k 个结点

    面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ...

  7. 剑指offer(14)链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...

  8. 【Offer】[22] 【链表中倒数第k个结点】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路分析 采用双指针的方法,第一个指针首先向前移动k-1个位置,第二个指针指向头节点,然后将 ...

  9. 15 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. p1先走k-1步,p1 p2再一起走 C++: /* struct ListNode { int val; struct ListNode *next; L ...

随机推荐

  1. Smallest Rectangle Enclosing Black Pixels 解答

    Question An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. ...

  2. bzoj2049-洞穴勘测(动态树lct模板题)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  3. WEB应用知识一二三

    1.HTTP协议 |--基于请求(Request)和响应(Response)的无状态通讯协议 浏览器和WEB应用程序通过HTTP进行通信.客户端通过URL对指定服务器要求特定位置的数据 |--POST ...

  4. Hibernate(三)——框架中的关系映射

    在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...

  5. C库函数笔记

    一.string.h 1.memcpy 函数原型:void *memcpy(void *dest, const void *src, size_t n); 功能:从源src所指的内存地址的起始位置开始 ...

  6. Eclipse代理设置

    这段时间公司实行代理上网,不仅通过浏览器上网须要不停的输入username和password,在本地调试程序时候Eclipse居然也弹出框让输入username和password. 如图: 解决的方法 ...

  7. 自增运算a++和++b(1)

    #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code f[]={0x3f,0 ...

  8. java中的二进制

    (1)按位与运算 & 1 & 1 = 1, 0 & 1 = 0 51 & 5  即 0011  0011 & 0000  0101 =0000 0001 = 1 ...

  9. break,continue,return 区别

    using System;using System.Collections.Generic;using System.Text; namespace breakcontinue_test{    cl ...

  10. Struts2中的校验框架

    Struts2提供的客户端校验 尽管这种支持比较弱,但采用Struts2中的客户端校验时需要注意以下几点 1..将<s:form validate="true">的va ...