问题:将一个单向单向链表逆序倒转,要求O(n)的时间复杂度和O(1)的空间复杂度
该问题有两种解法,一种非递归,一种是递归,代码如下:
#include <stdio.h>
#include "Link.h"
typedef struct linknode
{
int value;
struct linknode* next;
} LinkNode;
//递归
LinkNode* ReverseLink(LinkNode* link)
{
if (link->next == NULL)
{
return link;
}
LinkNode* nextNode = link->next;
LinkNode* reverseLink = ReverseLink(link->next);
nextNode->next = link;
link->next = NULL;
return reverseLink;
}
//非递归
LinkNode* ReverseLink2(LinkNode* link)
{
LinkNode* pre = NULL;
LinkNode* curNode = link;
LinkNode* tempNode = NULL;
while (curNode)
{
tempNode = curNode->next;
curNode->next = pre;
pre = curNode;
curNode = tempNode;
}
LinkNode* reverseLink = pre;
return reverseLink;
}
int main(int argc, char** argv)
{
LinkNode* head = NULL;
LinkNode* tail = NULL;
for (int i = 101; i < 200; i += 5)
{
LinkNode* p = new LinkNode;
p->value = i;
p->next = NULL;
if (!head)
{
head = p;
tail = head;
}
else
{
tail->next = p;
tail = p;
}
}
LinkNode* publicLink = head;
printf("Before Reverse: ");
LinkNode* temp = publicLink;
while (temp)
{
printf("%d ", temp->value);
temp = temp->next;
}
printf("\n");
printf("After Reverse: ");
//LinkNode* reverseLink = ReverseLink(publicLink);
LinkNode* reverseLink = ReverseLink2(publicLink);
temp = reverseLink;
while (temp)
{
printf("%d ", temp->value);
temp = temp->next;
}
getchar();
return 0;
}