面试100题:13.求单向链表倒数第k个节点
来源:互联网 发布:大数据 税收风险管理 编辑:程序博客网 时间:2024/05/14 14:55
题目:
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。
分析:
因为是单向链表,不能从尾部向头部遍历,所以要找到一种合适的方法遍历到倒数第K个节点。
解一:
假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1个结点(从0开始计数)。如果我们能够得到链表中结点的个数n,那我们只要从头结点开始往后走n-k-1步就可以了。如何得到结点数n?这个不难,只需要从头开始遍历链表,每经过一个结点,计数器加一就行了。这种思路的时间复杂度是O(n),但需要遍历链表两次。第一次得到链表中结点个数n,第二次得到从头结点开始的第n-k-1个结点即倒数第k个结点。
- /*Title: 13.求单向链表倒数第k个节点:解一
- Author: gocode
- Date: 2012-10-15*/
- #include <iostream>
- using namespace std;
- struct ListNode
- {
- int m_nKey;
- ListNode* m_pNext;
- };
- ListNode* Head;
- ListNode* pCur;
- void AddToList(ListNode* &pCur, unsigned int key)
- {
- if(pCur == NULL)
- {
- ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
- newNode->m_nKey = key;
- newNode->m_pNext = NULL;
- pCur = newNode;
- Head = newNode;
- }
- else
- {
- ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
- newNode->m_nKey = key;
- newNode->m_pNext = NULL;
- pCur->m_pNext = newNode;
- pCur = newNode;
- }
- }
- ListNode* FindKthToTail_Solution1(ListNode* pListHead, unsigned int k)
- {
- if(pListHead == NULL)
- return NULL;
- // 计算链表里节点个数
- ListNode *pCur = pListHead;
- unsigned int nNum = 0;
- while(pCur != NULL)
- {
- pCur = pCur->m_pNext;
- nNum ++;
- }
- // 如果链表节点数小于k,则退出
- if(nNum < k)
- return NULL;
- // 倒数第k个节点也是整数第n-k个节点
- // 找到它
- pCur = pListHead;
- for(unsigned int i = 0; i < nNum - k; ++ i)
- pCur = pCur->m_pNext;
- return pCur;
- }
- void DisplayList(ListNode* pHead)
- {
- ListNode* p = pHead;
- if(p == NULL)
- cout<<"The LinkedList is empty."<<endl;
- else
- {
- while(p != NULL)
- {
- cout<<p->m_nKey<<" ";
- p = p->m_pNext;
- }
- }
- cout<<endl;
- }
- void main()
- {
- Head = pCur = NULL;
- AddToList(pCur, 1);
- AddToList(pCur, 2);
- AddToList(pCur, 3);
- AddToList(pCur, 4);
- AddToList(pCur, 5);
- AddToList(pCur, 6);
- AddToList(pCur, 7);
- DisplayList(Head);
- cout<<"13.求单向链表倒数第k个节点:解一"<<endl;
- cout<<"The Kth from tail is: "<<FindKthToTail_Solution1(Head, 3)->m_nKey<<endl;
- system("pause");
- }
解二:
设置p1和p2两个指针,开始时均指向头指针head,然后p2向后移动k个节点,接着同时移动p1和p2节点,当p2指向尾部NULL时,此时p1指向的就是倒数第k个节点。
- /*Title: 13.求单向链表倒数第k个节点:解二
- Author: gocode
- Date: 2012-10-15*/
- #include <iostream>
- using namespace std;
- struct ListNode
- {
- int m_nKey;
- ListNode* m_pNext;
- };
- ListNode* Head;
- ListNode* pCur;
- void AddToList(ListNode* &pCur, unsigned int key)
- {
- if(pCur == NULL)
- {
- ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
- newNode->m_nKey = key;
- newNode->m_pNext = NULL;
- pCur = newNode;
- Head = newNode;
- }
- else
- {
- ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
- newNode->m_nKey = key;
- newNode->m_pNext = NULL;
- pCur->m_pNext = newNode;
- pCur = newNode;
- }
- }
- ListNode* FindKthToTail_Solution2(ListNode* pListHead, unsigned int k)
- {
- if(pListHead == NULL)
- return NULL;
- ListNode *p1, *p2 = pListHead;
- unsigned int nNum = 1;
- while(p2 != NULL)
- {
- p2 = p2->m_pNext;
- nNum ++;
- if(nNum == k) // 结束条件
- break;
- }
- // if the number of nodes in the list is less than k
- // do nothing
- if(nNum < k)
- return NULL;
- // 现在p1和p2之间的距离保持为k个节点
- // 同时移动它们,直到p2指向NULL
- p1 = pListHead;
- while(p2->m_pNext != NULL)
- {
- p1 = p1->m_pNext;
- p2 = p2->m_pNext;
- }
- return p1;
- }
- void DisplayList(ListNode* pHead)
- {
- ListNode* p = pHead;
- if(p == NULL)
- cout<<"The LinkedList is empty."<<endl;
- else
- {
- while(p != NULL)
- {
- cout<<p->m_nKey<<" ";
- p = p->m_pNext;
- }
- }
- cout<<endl;
- }
- void main()
- {
- Head = pCur = NULL;
- AddToList(pCur, 1);
- AddToList(pCur, 2);
- AddToList(pCur, 3);
- AddToList(pCur, 4);
- AddToList(pCur, 5);
- AddToList(pCur, 6);
- AddToList(pCur, 7);
- DisplayList(Head);
- cout<<"13.求单向链表倒数第k个节点:解二"<<endl;
- cout<<"The Kth from tail is: "<<FindKthToTail_Solution2(Head, 3)->m_nKey<<endl;
- system("pause");
- }
0 0
- 面试100题:13.求单向链表倒数第k个节点
- 面试100题:13.求单向链表倒数第k个节点
- 求单向链表倒数第k个节点
- 13. 求单向链表中倒数第k个节点
- 求单向链表中的倒数第K个节点2
- 输出单向链表倒数第k个节点,倒数第0个指向尾节点.
- 单向链表倒数第K个节点
- C++求解单向链表倒数第k个节点
- 单向链表_找出倒数第K个节点
- 寻找单向链表的倒数第k个节点
- 单向链表的倒数第k个节点
- 程序员面试100题(算法)之查找链表中倒数第k个节点(含单向链表的创建和打印)
- 微软面试之13 输入一个单向链表 输出该链表的倒数第k个节点
- 【编程题目】Pq.8--求单向链表的倒数第k个节点(关于代码鲁棒性的探讨)
- [java 面试100道]13.输入一个单向链表,输出该链表中倒数第k个结点。
- 微软面试100题之13题:输入一个单向链表,输出该链表中倒数第k 个结点
- 链表倒数第k个节点
- 链表倒数第k个节点
- Mysql索引算法
- 托静谎业沉放
- 来来往往
- /etc/profile、~/.bash_profile 等几个文件的执行过程
- C++primer——形参、局部变量和静态局部变量的差别
- 面试100题:13.求单向链表倒数第k个节点
- Android开发之子线程中Toast的显示
- Android调试的几个命令实践
- JavaScript 事件
- Android 中 ListView 分页加载数据
- 1001. A + B for Matrices
- ReportBuiler for Delphi 7 ~ XE 5 v15.03
- 如果当你使用POI从Excel中删除Row,请留意
- s3c6410 开发板Linux系统支持 K9GAG08U0E的方法