输入一个单链表,反转单链表后,输出新链表的表头。
算法思路:反转链表的核心其实就是反转指针,需要注意的是要保存好节点的指针,以防链表断开,所以在这里我选择了使用三个指针,用一个指针指向头节点的前一位,一个指针指向头节点的后一位,每反转一个指针就把头节点往后移一位
#include <iostream>
using namespace std;
typedef int datatype;
typedef struct list
{
datatype data;
struct list *next;
list(int x) :data(x), next(NULL) {}
}list;
list * ListInit(datatype data)
{
list *head = new list(data);
return head;
}
int insert_tail(list *head, datatype data)
{
list *newNode = new list(data);
if (NULL == head->next)
{
head->next = newNode;
return 1;
}
list *p = head->next;
while (1)
{
if (p->next == NULL)
break;
p = p->next;
}
p->next = newNode;
return 1;
}
void ListShow(list *head)
{
list *p = head;
while (1)
{
if (p == NULL)
break;
cout << p->data << '\t';
p = p->next;
}
}
list * reverseList(list *head)
{
list *root = head;
list *pre = NULL;
list *next = NULL;
if (head == NULL)
return NULL;
while (root->next)
{
next = root->next;
root->next = pre;
pre = root;
root = next;
}
root->next = pre;
return root;
}
int main()
{
list *myhead = ListInit(1);
for (int i = 2; i < 10; i++)
insert_tail(myhead, i);
ListShow(myhead);
myhead = reverseList(myhead);
cout << endl;
ListShow(myhead);
}