反转单向和双向链表
问题描述:
反转单向链表和双向链表
要求:
如果链表长度为N,时间复杂度要求为O(N),额外的空间复杂度要求为O(1)
图解算法
代码实现
#include <iostream>
using namespace std;
struct SingleNode
{
int value;
SingleNode *next;
};
struct DoubleNode
{
int value;
DoubleNode *pre;
DoubleNode *next;
};
SingleNode* reverseList(SingleNode *head)
{
SingleNode *pre = NULL;
SingleNode *next = NULL;
//head为当前,pre为之前,next为之后
while(NULL != head)
{
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
DoubleNode* reverseList(DoubleNode *head)
{
DoubleNode *pre = NULL;
DoubleNode *next = NULL;
while(NULL != head)
{
next = head->next;
head->next = pre;
head->pre = next; //多了一步前置处理
pre = head;
head = next;
}
return pre;
}
void printList(SingleNode *head)
{
while(NULL != head)
{
cout << head->value << " ";
head = head->next;
}
cout << endl;
}
void printList(DoubleNode *head)
{
while(NULL != head)
{
cout << head->value << " ";
head = head->next;
}
cout << endl;
}
int main()
{
SingleNode *shead = NULL;
SingleNode *sptr;
DoubleNode *dhead = NULL;
DoubleNode *dptr;
for(int i =0;i<10;i++)
{
if(NULL == shead && NULL == dhead)
{
shead = new SingleNode;
shead->value = i;
shead->next = NULL;
sptr = shead;
dhead = new DoubleNode;
dhead->value = i;
dhead->next = NULL;
dhead->pre = NULL;
dptr = dhead;
continue;
}
sptr->next = new SingleNode;
sptr = sptr->next;
sptr->value = i;
sptr->next = NULL;
dptr->next = new DoubleNode;
dptr->next->pre = dptr;
dptr = dptr->next;
dptr->value = i;
dptr->next = NULL;
}
cout << "SingleNode before reversed: " << endl;
printList(shead);
cout << "SingleNode after reversed: " << endl;
shead = reverseList(shead);
printList(shead);
cout << "DoubleNode before reversed: " << endl;
printList(dhead);
cout << "DoubleNode after reversed: " << endl;
dhead = reverseList(dhead);
printList(dhead);
return 0;
}