输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下:

#include <iostream>
using namespace std;
struct LinkNode
{
public:
LinkNode(int value = 0) : nValue(value){ pNext = NULL; }
~LinkNode() { pNext = NULL; }
//private:
friend class LinkList;
int nValue;
LinkNode *pNext;
}; //带头结点的链表
class LinkList
{
public:
LinkList();
~LinkList();
void Insert(int nData); //插入元素
void Delete(int nData); //删除元素
void Sort(); //排序
bool IsEmpty(); //判断是否为空
void Reverse(); //反转
void Destroy(); //销毁整个链表
int Length(); //链表长度
LinkNode* Find(int nData); //查找元素
bool IsLoop(); //判断是否为环
void Print(); //打印链表
LinkNode *FindByIndex(int n); //返回链表中第i个元素
LinkNode *FindLastNum(int n); //使用两个指针 高效操作
private:
LinkNode *pHead;
}; LinkList::LinkList()
{
pHead = new LinkNode();
}
LinkList::~LinkList()
{
Destroy();
}
//从大到小插入
void LinkList::Insert(int nData)
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return;
}
LinkNode *pCur = pHead;
while (pCur->pNext != NULL)
{
if (pCur->pNext->nValue < nData)
{
break;
}
pCur = pCur->pNext;
}
LinkNode *pTmp = new LinkNode(nData);
pTmp->pNext = pCur->pNext;
pCur->pNext = pTmp;
} void LinkList::Delete(int nData)
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return;
}
if (pHead->pNext == NULL)
{
cout << "链表为空!" << endl;
return;
} LinkNode *pCur = pHead;
while (pCur->pNext)
{
if (pCur->pNext->nValue == nData)
{
LinkNode *pDel = pCur->pNext;
pCur->pNext = pCur->pNext->pNext; pDel->pNext = NULL;
delete (pDel);
}
else
{
pCur = pCur->pNext;
}
}
} void LinkList::Sort()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return;
}
if (pHead->pNext == NULL)
{
cout << "链表为空!" << endl;
} LinkNode *pCur = pHead->pNext;
LinkNode *pPre = pHead; LinkNode *pNewHead = new LinkNode();
while (pCur)
{
LinkNode *pTmp = pCur;
pCur = pCur->pNext; //将pTmp结点插入到pNewHead指向的新链表中
LinkNode *p = pNewHead;
while (p->pNext)
{
if (p->pNext->nValue > pTmp->nValue)
{
break;
}
p = p->pNext;
}
pTmp->pNext = p->pNext;
p->pNext = pTmp;
}
delete pHead;
pHead = pNewHead;
}
bool LinkList::IsEmpty()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return false;
} return pHead->pNext == NULL;
} int LinkList::Length()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return 0;
}
int nLength = 0;
LinkNode *pCur = pHead->pNext;
while (pCur)
{
nLength++;
pCur = pCur->pNext;
} return nLength;
}
void LinkList::Reverse()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
}
if (pHead->pNext == NULL)
{
cout << "链表为空!" << endl;
}
else
{
LinkNode *pCur = pHead->pNext->pNext;
LinkNode *pPre = pHead->pNext;
LinkNode *pnext = NULL; while (pCur)
{
pnext = pCur->pNext;
pCur->pNext = pPre; pPre = pCur;
pCur = pnext;
} pHead->pNext->pNext = NULL;
pHead->pNext = pPre;
}
}
void LinkList::Destroy()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return;
} while (pHead->pNext)
{
LinkNode *pDel = pHead->pNext;
pHead->pNext = pDel->pNext;
delete pDel;
}
delete pHead;
pHead = NULL;
}
LinkNode* LinkList::Find(int nData)
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return NULL;
}
if (pHead->pNext == NULL)
{
cout << "链表为空!" << endl;
return NULL;
} LinkNode *pCur = pHead->pNext;
while (pCur != NULL)
{
if (pCur->nValue == nData)
{
return pCur;
}
} return NULL;
}
void LinkList::Print()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return;
}
if (pHead->pNext == NULL)
{
cout << "链表为空!" << endl;
return;
}
else
{
LinkNode *pCur = pHead->pNext;
while (pCur)
{
cout << pCur->nValue << " ";
pCur = pCur->pNext;
}
cout << endl;
}
}
bool LinkList::IsLoop()
{
if (pHead == NULL)
{
cout << "链表未创建!" << endl;
return false;
}
if (pHead->pNext == NULL)
{
cout << "链表为空!" << endl;
return false;
} LinkNode *pFast = pHead->pNext;
LinkNode *pLow = pHead->pNext; while (pFast != NULL && pLow != NULL && pFast->pNext != NULL)
{
pFast = pFast->pNext->pNext;
pLow = pLow->pNext;
if (pFast == pLow)
{
return true;
}
}
return false;
} LinkNode* LinkList::FindByIndex(int n)
{
if (n <= 0 || n > Length())
{
return NULL;
}
LinkNode *pCur = pHead->pNext;
for (int i = 1; i < n; i++)
{
pCur = pCur->pNext;
} return pCur;
} LinkNode* LinkList::FindLastNum(int n) //使用两个指针 高效操作
{
if (pHead == NULL || pHead->pNext == NULL || n < 0)
{
return NULL;
}
LinkNode *pCur = pHead->pNext;
LinkNode *pFirst = pHead->pNext; while (n > 0)
{
pFirst = pFirst->pNext;
if (pFirst == NULL)
{
return NULL;
}
n--;
}
while (pFirst->pNext)
{
pFirst = pFirst->pNext;
pCur = pCur->pNext;
} return pCur;
}
int main()
{
LinkList list;
list.Insert(12);
list.Insert(14);
list.Insert(2);
list.Insert(122);
list.Insert(5);
list.Insert(4);
list.Insert(7);
list.Print();
int k;
cout << "请输入要查询倒数第几个结点(计数从0开始):";
cin >> k;
LinkNode *p = list.FindByIndex(list.Length() - k);
if (p)
{
cout << p->nValue << endl;
}
LinkNode *p2 = list.FindLastNum(k);
if (p2)
{
cout << p2->nValue << endl;
}
system("pause");
return 0;
}

运行结果如图1所示:

aaarticlea/png;base64,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" alt="" />

图1 运行效果

输入一个单向链表,输出该链表中倒数第K个结点的更多相关文章

  1. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  2. 算法:输入一个链表,输出该链表中倒数第k个结点。

    算法:输入一个链表,输出该链表中倒数第k个结点.<剑指offer> 思路加到注释里面了: 1:两个if判断是否返回值为空,首个为空,没有第k个值: 2:for循环找到倒数第k个值,返回为a ...

  3. 【剑指offer】输入一个链表,输出该链表中倒数第k个结点。

    一.题目: 输入一个链表,输出该链表中倒数第k个结点. 二.思路: 用两个指针p1和p2,p2先跑k步,然后p1和p2同时跑,p2跑到头p1所在的位置就是倒数第k个节点.很简单吧?简单你也想不到,想到 ...

  4. 剑指offer14:输入一个链表,输出该链表中倒数第k个结点。

    1. 题目描述 输入一个链表,输出该链表中倒数第k个结点. 2. 思路和方法 可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,然后两个指针的距离始终保持k-1.这样,当第一 ...

  5. 剑指Offer-14:输入一个链表,输出该链表中倒数第k个结点。

    题目描述: 输入一个链表,输出该链表中倒数第k个结点.例如有一个链表有六个节点1,2,3,4,5,6.则它的倒数第二个节点为5 节点定义如下: public class ListNode { int ...

  6. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  7. [华为]输出单向链表中倒数第k个结点

    输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* m_ ...

  8. 输出单项链表中倒数第k个结点——牛客刷题

    题目描述: 输入一个单向链表,输出该链表中倒数第k个结点 输入.输出描述: 输入说明:1.链表结点个数 2.链表结点的值3.输入k的值 输出说明:第k个结点指针 题目分析: 假设链表长度为n,倒数第k ...

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

    /* 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct node { int data; struct node * ...

随机推荐

  1. [置顶] iOS 名片识别代码

    采用的是惠普图片识别SDK.本代码可以识别中文.代码改自 http://www.cocoachina.com/bbs/read.php?tid=123463 . 图片就不贴了,123463中的效果是可 ...

  2. nodejs这个过程POST求

    下面是一个web登陆模拟过程.当我们问一个链接,你得到一个表格,然后填写相应的表格值,然后提交登陆. var http = require('http'); var querystring = req ...

  3. 妹子图太多怎么看才好,Swing来支招

    近期事少,翻开非常久曾经写的小程序,创意倒是尚可,代码写的却比較基础,非常多东西没有实现,略改了改形成了如今的模样,如今大家都忙着大数据,中间件,web开发,偶尔看看Java Swing的作品,也许能 ...

  4. Qt应用中检测内存泄露——VLD

    本文简要描述一下在Qt应用中使用VLD来检测内存泄露.本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express. 1.下载并安装:VLD-2.2: h ...

  5. JDK5-静态导入

    import static 1. 导入一个类内所有静态成员 import static java.lang.Math.*; public class StaticImport { public sta ...

  6. Http API设计

    Heroku团队根据heroku platform api和他们自己内部系统的实践经验总结了一些http api设计的准则,发布到了github上. 地址:https://github.com/int ...

  7. Linux access

    1.access函数 功能描述:检查调用进程是否可以对指定的文件执行某种操作. 用法: #include <unistd.h> #include <fcntl.h>int ac ...

  8. markdown 简明语法

    今天同事聊到markdown用法 之前不怎么了解  先把网上的建明语法贴出来 以备后用. 基本符号 *,-,+ 3个符号效果都一样,这3个符号被称为 Markdown符号 空白行表示另起一个段落 `是 ...

  9. servlet+jdbc+javabean其实跟ssh差不多

    我给的这个架构可以代替ssh的架构进行项目的开发 common中放的是一些公用类 dao中放的是一些对数据的处理 entity其实也就是javabean service中放的是一些抽象类,简单来说抽象 ...

  10. 操作iis

    以后研究 try { string method = "Recycle"; string AppPoolName = "z.chinabett.com"; Di ...