问题描述:
原题链接:跳转至原题
问题分析:
本题的要求是反转链表。对于一个结点 p 和 p 的后继结点 q ,在反转过后,q 的 next指针指向 p。
问题解法:
对于反转链表问题,给出的通解是:用指针遍历原链表中的每个结点,并在每次访问结点时,完成当前结点与其前一结点的反转。以下将给出递归与非递归两种写法。
代码实现:
#include<iostream>
typedef struct node {
int val;
struct node* next;
}ListNode;
//初始化链表
ListNode* buildLinkedList();
//反转链表
ListNode* reverseLinkedList(ListNode* head, ListNode* prev);
//print出链表中每个结点储存的值
void traverseList(ListNode* head);
int main()
{
ListNode* head = NULL;
head = buildLinkedList();
//traverseList(head);
head = reverseLinkedList(head,NULL);
traverseList(head);
return 0;
}
ListNode* buildLinkedList()
{
ListNode* head = new ListNode; head->next = NULL;
ListNode* p = head;
int val;
while (scanf("%d",&val) == 1) {
if (val == -1) break;
p->next = new ListNode;
p->next->val = val; p->next->next = NULL;
p = p->next;
}
ListNode* newhead = head->next;
head->next = NULL;
delete head;
return newhead;
}
//递归
ListNode* reverseLinkedList(ListNode* head, ListNode* prev)
{
//结束条件,表示当前链表已经遍历完成
if (head == NULL) {
return prev;
}
ListNode* next = head->next;
head->next = prev;
//访问下一结点,更新head与prev
return reverseLinkedList(next,head);
}
/*
//非递归
ListNode* reverseLinkedList(ListNode* head)
{
ListNode* prev= NULL;
while (head) {
ListNode* next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
*/
void traverseList(ListNode* head)
{
while (head) {
printf("%d",head->val); putchar(' ');
head = head->next;
}
putchar('\n');
}
运行结果: