十四题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:
1.反转链表,然后求第k个节点
2.利用空间换时间,把链表每个结点都存在vector中
3.链表倒数第k个,就是正数第l-k+1个;利用两个指针,第一个先走k-1个节点,然后第二个开始一起走,这样第二个节点就走了l-k+1个。
思路2:
时间复杂度:O(n)
/*
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)
return NULL;
vector<ListNode*> data;
while(pListHead != NULL)
{
data.push_back(pListHead);
pListHead=pListHead->next;
}
int len = data.size();
if(len<k || k==0)
return NULL;
return data[len-k];
}
};
思路3:
时间复杂度O(n)
/*
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)
return NULL;
ListNode* p1=pListHead;
ListNode* p2=pListHead;
for(int i=0;i<k;++i)
{
if(p2==NULL)
return NULL;
p2=p2->next;
}
while(p2 != NULL)
{
p1=p1->next;
p2=p2->next;
}
return p1;
}
};
# -*- 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:
return None
p1=head
p2=head
for i in range(k):
if p2==None:
return None;
p2=p2.next;
while p2!=None:
p2=p2.next;
p1=p1.next;
return p1
# write code here
十五题目描述
输入一个链表,反转链表后,输出新链表的表头。
时间复杂度:O(n)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL)
return NULL;
ListNode* p0=pHead;
ListNode* p1=NULL;
while(p0!=NULL)
{
ListNode* temp=p0->next;
p0->next=p1;
p1=p0;
p0=temp;
}
return p1;
}
};
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
p1=pHead
head=None
while p1!=None:
temp=p1.next
p1.next=head
head=p1
p1=temp
return head
# write code here