微软算法面试(17):单链表就地逆置
题目是:链表操作,单链表就地逆置
分析:
这题只需要设置三个指针就搞定了,ListNode* p 表示当前指针, ListNode* fp: 上一个节点指针, ListNode * ep :下一个节点指针
p ->next = fp;
fp = p;
p = ep;
ep = p->next;
具体实现如下:
#include<iostream>
using namespace std;
struct ListNode{
ListNode(int _v):value(_v), next(NULL){}
int value;
ListNode* next;
void add(ListNode* _ln)
{
if(next == NULL)
next = _ln;
else
next->add(_ln);
}
};
void invertList(ListNode* &root)
{
ListNode *fp, *p, *ep;
p = root;
fp = NULL;
while(p!= NULL)
{
ep = p->next;
p->next = fp;
fp = p;
p = ep;
}
root = fp;
return;
}
int main()
{
ListNode *root = NULL;
ListNode n1(0);
ListNode n2(1);
ListNode n3(2);
ListNode n4(3);
ListNode n5(4);
root = &n1;
root->add(&n2);
root->add(&n3);
root->add(&n4);
root->add(&n5);
ListNode* p = root;
while(p != NULL)
{
cout<< p->value << " " ;
p = p->next;
}
cout << endl;
invertList(root);
cout << "after invert: ";
p = root;
while(p != NULL)
{
cout<< p->value << " " ;
p = p->next;
}
cout << endl;
}
输出结果为:
0 1 2 3 4
after invert: 4 3 2 1 0