提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
题目地址
题目描述:
一、拿到题目如何分析?
遇到这种类型的题目,我们可以设置双指针p1和p2。第一个指针从链表的头指针向前走k-1,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始移动。由于两个指针的距离保持在k-1,当第一个p1(走在前面的)指针到达链表的尾结点时,第二个指针p2(走在后面的)指针正好是倒数第k个结点。
二、根据思路编写代码
考虑到可能编程语言的问题,此代码用python和c++两种语言给大家展示。
1.python(2.7)代码
代码如下:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
if head == None or k == 0: #如果链表为空或者k为0时,直接返回空
return None
p1 = head
p2 = head
for i in range(k-1):#第一个结点先移动k-1步
if p1.next == None:#如果在遍历的过程中发现下一个节点为空,说明此链表长度小于k,直接返回
return None
else: #满足条件,指向下一个结点
p1 = p1.next
while p1.next!=None:#从第k步开始,两个指针一起遍历
p1 = p1.next
p2 = p2.next
return p2 #最终返回p2所指向的结点
# write code here
2.C++11(clang++3.9)代码
代码如下(示例):
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead ==NULL||k==0) /* 先判断pListHead是否为空,传入的k是否为0*/
return NULL;
ListNode *phead = pListHead; /*前一个指针 */
ListNode *ptail = pListHead; /* 后一个指针 */
for (int i=0;i<k-1;i++){ /* 前一个指针先后移k-1位 */
if(phead->next != NULL){
phead = phead->next;
}
else{
return NULL;
}
}
while(phead->next != NULL){ /* 两个同时后移,当第一个到达尾部的时候,后一个刚好到倒数第k个 */
phead = phead->next;
ptail = ptail->next;
}
return ptail; /*返回倒数第k个结点 */
}
};
该处使用的url网络请求的数据。
总结
提示:以后遇到类似问题,学会使用双指针来解决。