链表逆序 - Reverse Linked List
描述
Reverse a singly linked list. (链表逆序)
方法有两种
都不需要申请额外内存;
- 非递归方法:两个指针完成逆序;
- 递归方法:递归从尾到头完成逆序;
类方法代码,测试代码如下:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
/****** leecode 提交代码:非递归 *******/
class Solution {
public:
LinkNode* reverseLinkList(LinkNode* head) {
if (!head)
return NULL;
LinkNode *pre = head;
LinkNode *cur = head->next;
while(cur)
{
pre->next = cur->next;
cur->next = head;
head = cur;
cur = pre->next;
}
return head;
}
};
/*******************************/
/****** leecode 提交代码:递归(很有意思~) *******/
class SolutionRec{
public:
LinkNode* reverseLinkList(LinkNode* head) {
if (head==NULL || head->next==NULL)
return head;
LinkNode* newhead = reverseLinkList(head->next);
head->next->next = head;
head->next = NULL;
return newhead;
}
};
/*******************************/
/* 打印顺序链表 */
void PrintLinkList(LinkNode* L)
{
LinkNode *s = L;
while(s)
{
cout << s->data << " ";
s = s->next;
}
cout << endl;;
}
/* 头插法:随机产生数据头插构建链表 */
LinkNode* CreateListHead(int n)
{
int i;
srand(time(0));
LinkNode *L, *p;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->data = 0;
L->next = NULL;
for(i=0; i<n; i++)
{
p = new LinkNode;
p->data = rand()%100 + 1;
p->next = L->next;
L->next = p;
}
return L;
}
int main()
{
LinkNode *L, *newL;
L = CreateListHead(10);
PrintLinkList(L);
Solution s;
newL = s.reverseLinkList(L);
PrintLinkList(newL);
SolutionRec sr;
newL = sr.reverseLinkList(newL);
PrintLinkList(newL);
return 0;
}