【面试题十五】链表中倒数第k个结点
来源:互联网 发布:微盘软件下载 编辑:程序博客网 时间:2024/06/06 08:42
链表中倒数第k个结点
可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动,当第一个指针移动到末尾的时候,第二个指针指向的就是倒数第K个结点;
两个指针的间距保持为k-1;
当我们遍历列表的时候发现用一个指针是解决不了问题的,我们可以尝试用两个指针来解决问题,一个指针走的比另外一个指针走得快一点,或者先让其中的一个指针走了若干步,然后再让第二个指针来走;
kth.cpp:
#include <iostream>#include <cstdio>#include "List.h"ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){if(pListHead == NULL || k == 0){return NULL;}ListNode* pAhead = pListHead;ListNode* pBehind = NULL;for(unsigned int i = 0; i < k - 1; ++i){if(pAhead->m_pNext != NULL){pAhead = pAhead->m_pNext;}else{return NULL;}}pBehind = pListHead;while(pAhead->m_pNext != NULL){pAhead = pAhead->m_pNext;pBehind = pBehind->m_pNext;}return pBehind;}// ====================测试代码====================// 测试要找的结点在链表中间void Test1(){ printf("=====Test1 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: 4.\n"); ListNode* pNode = FindKthToTail(pNode1, 2); PrintListNode(pNode); DestroyList(pNode1);}// 测试要找的结点是链表的尾结点void Test2(){ printf("=====Test2 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: 5.\n"); ListNode* pNode = FindKthToTail(pNode1, 1); PrintListNode(pNode); DestroyList(pNode1);}// 测试要找的结点是链表的头结点void Test3(){ printf("=====Test3 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: 1.\n"); ListNode* pNode = FindKthToTail(pNode1, 5); PrintListNode(pNode); DestroyList(pNode1);}// 测试空链表void Test4(){ printf("=====Test4 starts:=====\n"); printf("expected result: NULL.\n"); ListNode* pNode = FindKthToTail(NULL, 100); PrintListNode(pNode);}// 测试输入的第二个参数大于链表的结点总数void Test5(){ printf("=====Test5 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: NULL.\n"); ListNode* pNode = FindKthToTail(pNode1, 6); PrintListNode(pNode); DestroyList(pNode1);}// 测试输入的第二个参数为0void Test6(){ printf("=====Test6 starts:=====\n"); ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); printf("expected result: NULL.\n"); ListNode* pNode = FindKthToTail(pNode1, 0); PrintListNode(pNode); DestroyList(pNode1);}int main(){Test1(); Test2(); Test3(); Test4(); Test5(); Test6();return 0;}
List.h:
#ifndef _List_H_#define _List_H_struct ListNode{ int m_nValue; ListNode* m_pNext;};ListNode* CreateListNode(int value);void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);void PrintListNode(ListNode* pNode);void PrintList(ListNode* pHead);void DestroyList(ListNode* pHead);void AddToTail(ListNode** pHead, int value);void RemoveNode(ListNode** pHead, int value);#endif /*_List_H_*/
List.cpp:
#include "List.h"#include <stdio.h>#include <stdlib.h>ListNode* CreateListNode(int value){ ListNode* pNode = new ListNode(); pNode->m_nValue = value; pNode->m_pNext = NULL; return pNode;}void ConnectListNodes(ListNode* pCurrent, ListNode* pNext){ if(pCurrent == NULL) { printf("Error to connect two nodes.\n"); exit(1); } pCurrent->m_pNext = pNext;}void PrintListNode(ListNode* pNode){ if(pNode == NULL) { printf("The node is NULL\n"); } else { printf("The key in node is %d.\n", pNode->m_nValue); }}void PrintList(ListNode* pHead){ printf("PrintList starts.\n"); ListNode* pNode = pHead; while(pNode != NULL) { printf("%d\t", pNode->m_nValue); pNode = pNode->m_pNext; } printf("\nPrintList ends.\n");}void DestroyList(ListNode* pHead){ ListNode* pNode = pHead; while(pNode != NULL) { pHead = pHead->m_pNext; delete pNode; pNode = pHead; }}void AddToTail(ListNode** pHead, int value){ ListNode* pNew = new ListNode(); pNew->m_nValue = value; pNew->m_pNext = NULL; if(*pHead == NULL) { *pHead = pNew; } else { ListNode* pNode = *pHead; while(pNode->m_pNext != NULL) pNode = pNode->m_pNext; pNode->m_pNext = pNew; }}void RemoveNode(ListNode** pHead, int value){ if(pHead == NULL || *pHead == NULL) return; ListNode* pToBeDeleted = NULL; if((*pHead)->m_nValue == value) { pToBeDeleted = *pHead; *pHead = (*pHead)->m_pNext; } else { ListNode* pNode = *pHead; while(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value) pNode = pNode->m_pNext; if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value) { pToBeDeleted = pNode->m_pNext; pNode->m_pNext = pNode->m_pNext->m_pNext; } } if(pToBeDeleted != NULL) { delete pToBeDeleted; pToBeDeleted = NULL; }}
Makefile:
.PHONY:cleanCPP=g++CFLAGS=-Wall -gBIN=testOBJS=Kth.o List.oLIBS=$(BIN):$(OBJS)$(CPP) $(CFLAGS) $^ -o $@ $(LIBS)%.o:%.cpp$(CPP) $(CFLAGS) -c $< -o $@clean:rm -f *.o $(BIN)
运行结果:
=====Test1 starts:=====expected result: 4.The key in node is 4.=====Test2 starts:=====expected result: 5.The key in node is 5.=====Test3 starts:=====expected result: 1.The key in node is 1.=====Test4 starts:=====expected result: NULL.The node is NULL=====Test5 starts:=====expected result: NULL.The node is NULL=====Test6 starts:=====expected result: NULL.The node is NULL
- 【面试题十五】链表中倒数第k个结点
- 面试题15:链表中倒数第k个结点
- 面试题13:链表中倒数第k个结点
- 面试题15 链表中倒数第K个结点
- 面试题15:链表中倒数第k个结点
- 面试题15链表中倒数第k个结点
- 面试题15:链表中倒数第k个结点
- 剑指offer面试题 链表中倒数第K个结点
- 面试题15:查找链表中倒数第k个结点
- 面试题15:链表中倒数第k个结点
- 面试题15:链表中倒数第k个结点
- 面试题15. 链表中倒数第k个结点
- 【面试题15】链表中倒数第K个结点
- 面试题15: 链表中倒数第k个结点
- 面试题15:链表中倒数第k个结点
- 面试题15 :链表中倒数第k个结点
- 面试题15—链表中倒数第K个结点
- 面试题15:链表中倒数第k个结点
- 【面试题十四】调整数组顺序使奇数位于偶数前面
- [EasyUI] EasyUI安装
- unbutu下Qt4支持sqlite3数据库的设置
- 做自己的镜子
- nyoj 109 数列转换(equal函数STL)
- 【面试题十五】链表中倒数第k个结点
- CentOS下修改hosts文件
- iBtais 多重嵌套循环
- 我对美国与日本恐怖片的区别分析(国家性格角度)
- hdu1166敌兵布阵
- CentOS如何部署TinyProxy
- 【面试题十六】反转链表
- 我开通blog了
- 【面试题十七】合并两个排序的链表