标签:style class code ext get string
题目:给定一个单链表的头结点要求反转该链表并要求不能改变更改链表的结构
分析:
1. 假设一个链表如下
headNode -> node1 -> node2 -> node3 -> node4 -> NULL
2. 则反转完这个链表之后,希望得到如下链表
NULL <- headNode <- node1 <- node2 <- node3 <- node4
3. 此时链表的头结点变成了node4,我们可以枚举整个链表,对每一个结点我们保存下前面一个结点和下面一个结点,然后更改结点内部指向下一结点的指针属性
例如node1的前面一个结点preNode为headNode,下面一个结点nextNode为node2,把node1->nextNode = headNode,然后更新preNode = node1,即可。
4. 实例代码
#include<stack>
#include<utility>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
//链表结点
struct ListNode{
int value;
ListNode *nextNode;
};
//建立链表
ListNode* BuildList(ListNode **headNode){
if(*headNode != NULL){
return *headNode;
}
(*headNode) = new ListNode();
(*headNode)->value = 1;
(*headNode)->nextNode = NULL;
ListNode *preNode = (*headNode);
for(int i = 2; i <= 5; i++){
ListNode *newNode = new ListNode();
newNode->value = i;
newNode->nextNode = NULL;
preNode->nextNode = newNode;
preNode = newNode;
}
return (*headNode);
}
//反转链表,参数是指针的指针这样才是地址传递
void RevertList(ListNode **headNode){
//如果空链表直接返回
if((*headNode) == NULL){
return;
}
ListNode *preNode = NULL;
ListNode *curNode = (*headNode);
while(curNode != NULL){
ListNode *nextNode = curNode->nextNode;
curNode->nextNode = preNode;
preNode = curNode;
curNode = nextNode;
}
(*headNode) = preNode;
}
//输出链表
void OutputList(ListNode *headNode){
//空链表直接返回
if(headNode == NULL){
return;
}
ListNode *tmpNode = headNode;
while(tmpNode != NULL){
cout<<tmpNode->value<<" ";
tmpNode = tmpNode->nextNode;
}
cout<<endl;
}
int main(){
ListNode *headNode = NULL;
//建立链表
headNode = BuildList(&headNode);
//输出链表
OutputList(headNode);
//反转链表
RevertList(&headNode);
//输出链表
OutputList(headNode);
getchar();
return 0;
}
/*
输出
1 2 3 4 5
5 4 3 2 1
*/
//一般来说如果要改变链表指针结点的值一般利用传递指针的指针
标签:style class code ext get string
原文地址:http://blog.csdn.net/chenguolinblog/article/details/30256071