题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
上面这道题可以直接先遍历一遍整个链表,得到总个数n,然后n-k得到正的序号,
或者先将链表翻转,然后找正的第k元素
下面给出三种翻转链表的方法
//============================================================================
// Name : RevertLink.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
struct Node{
int value;
Node* next;
};
Node* head = NULL;
void Revert1(Node* pHead);
Node* Revert2(Node* p);
void Revert3(Node* p);
Node* addNode(Node* p, int value);
void printNode();
int main() {
int input = 0;
Node* cur = head;
while(true){
cin>>input;
if(input!=-1)
cur = addNode(cur, input);
else
break;
}
printNode();
//Revert2(head)->next = NULL;
//Revert1(head);
Revert3(head);
printNode();
return 0;
}
/*
* 利用循环的方式,之前的帖子有用到这个方法
*/
void Revert1(Node* pHead){
if(pHead == NULL)
return;
Node* p1 = pHead;
Node* p2 = p1->next;
if(p2 == NULL)
return;
Node* p3 = p2->next;
while(p2 != NULL){
if(p1 == pHead)
p1->next = NULL;
p2->next = p1;
p1 = p2;
p2 = p3;
if(p3)
p3 = p3->next;
}
head = p1;
}
/*
* 利用递归的方式
*/
Node* Revert2(Node* p){
if(p == NULL)
return NULL;
Node* temp = Revert2(p->next);
if(temp != NULL)
temp->next = p;
else
head = p;
return p;
}
/*
* 利用辅助栈
*/
void Revert3(Node* p){
Node* pCur = NULL;
while(p!=NULL){
Node* temp = new Node();
temp->value = p->value;
temp->next = NULL;
if(pCur == NULL){
pCur = temp;
}else{
temp->next = pCur;
pCur = temp;
}
Node* delP = p;
p = p->next;
delete delP;
}
head = pCur;
}
/*
* 添加节点
*/
Node* addNode(Node* p, int value){
Node* temp = new Node();
temp->value = value;
temp->next = NULL;
if(p == NULL){
p = temp;
head = temp;
}
else
p->next = temp;
return temp;
}
void printNode(){
Node* p = head;
while(p != NULL){
cout<<p->value<<" ";
p = p->next;
}
cout<<endl;
}
5万+

被折叠的 条评论
为什么被折叠?



