逆转链表可以采用递归或者非递归方法实现,以下方法都没有使用额外的存储节点做中转
#include <iostream>
using namespace std;
struct ListNode{
int data;
ListNode *next;
};
void printLink(ListNode *head);
ListNode *reverseLink1(ListNode *head);
ListNode *reverseLink2(ListNode *head);
int main()
{
int n;
int i;
cin>>n;
ListNode *p = NULL;
ListNode *head = NULL;
ListNode *node = NULL;
for(i=0;i<n;i++)
{
node = new ListNode;
cin>>node->data;
if(head==NULL)
{
head = node;
} else {
p->next = node;
}
p = node;
if(i==n-1)
p->next = NULL;
}
p = reverseLink1(head);
printLink(p);
p = reverseLink2(p);
printLink(p);
return 0;
}
void printLink(ListNode *head)
{
ListNode *p;
p=head;
while(p!=NULL)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
//非递归实现逆转链表
ListNode *reverseLink1(ListNode *head)
{
ListNode *next;
ListNode *prev = NULL;
while(head!=NULL)
{
next=head->next;
head->next=prev;
prev=head;
head=next;
}
return prev;
}
//递归实现逆转链表
ListNode *reverseLink2(ListNode *head)
{
ListNode *newHead;
if((head==NULL)||(head->next==NULL))
return head;
newHead = reverseLink2(head->next);
head->next->next=head;
head->next=NULL;
return newHead;
}
打印结果,如下:
6
1 2 3 4 5 6
6 5 4 3 2 1
1 2 3 4 5 6
第一行为数字个数n,第二行为输入,第三行为用非递归方法逆转后链表的输出,第四行为用递归方法逆转后链表的输出,因为逆转了两次,所以第二行和第四行是一样的。