输入一个链表,输出该链表中倒数第k个结点。
2016-03-22 13:19
573 查看
1,问题:
输入一个链表,输出该链表中倒数第k个结点。
2,想法都在代码里标注了:
输入一个链表,输出该链表中倒数第k个结点。
2,想法都在代码里标注了:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { //思路1:先扫描链表,得到规模,再顺序扫描到指定位置 //缺点:扫描较多 /*if (pListHead == NULL || k <= 0) { return NULL; } int count = 0; ListNode* temp = pListHead; while (pListHead) { count++; pListHead = pListHead->next; } int m = count - k; //倒数第k个,是顺数第count - k +1个 if (m < 0) { return NULL; } else { while (m > 0) { temp = temp->next; m--; } return temp; } */ //思路2:倒数第k个位置,是顺数第n-k+1个位置 //设两个指针都指向头结点,那么第一个指针走k-1步到达顺数第k位置 //然后第二个指针和第一个指针一起走n-k步,即访问完链表,就到达了 //n-k+1位置,即倒数第k位置 if(pListHead == NULL || k <= 0) { return NULL; } ListNode* temp1 = pListHead; ListNode* temp2 = pListHead; //下边for循环的意思: //若i满足for循环条件,表示还要往下走 //但是temp1->next如果等于空,就说明下边没有节点了, //说明k比链表长度大,返回空 //否则就往下走到顺数k位置 for (int i =1; i < k; i++) { if (temp1->next == NULL) { return NULL; } else temp1 = temp1->next; } //上面若没有return,即走到了顺数k位置 //那么我再用下边这个while循环,走到 //倒数k位置,即顺数n-k+1位置即可 while (temp1->next) { temp2 = temp2->next; temp1 = temp1->next; } return temp2; } };
相关文章推荐
- ES2015 - Array (4)
- HTTPClient网络异常:java.lang.IllegalStateException: Content has been consumed
- 理解多态
- spring mvc ehcache 详细配置 亲测可用
- 分库
- maven中指定main方法并且导入关联jar包
- iOS 导出 ipa 包时 三个选项的意思
- 第四周项目13-猜数字游戏
- 嵌入式Linux系统Bootloader启动调试技术(回想)
- Android NDK环境搭建
- 1.1-NoSQL的总体介绍
- 配置HUE 遇到Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found
- 获取应用状态栏的高度
- 解决eclipse中maven出现的Failure to transfer XXX.jar的问题
- 黑马程序员--程序中流程控制
- 过去现在未来
- Bundle Adjustment光束平差法概述
- 第三十二讲--数据库的关闭和启动
- 单例模式
- KMP的原理详细讲解