/*
* 题目:
* 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
* 链表结点定义如下
*
* 问题:
* 1. 单向链表的遍历
*
* 思路:
* 1. 取出第一个结点和第二个结点,将第一个结点的后继结点设置为 null
* 2. 取出链表中两个相邻的结点 A、B
* tmp = B.next
* B.next = A
* A = B
* B = tmp
* 直到 B 结点为空
*/
#include <iostream>
#include <stdlib.h>
using namespace std ;
typedef struct link {
int data ;
struct link* next ;
} linkNode ;
linkNode* createLink() {
linkNode* head = NULL ;
head = (linkNode*)malloc(sizeof(link)) ;
linkNode*tmp=head ;
while(1) {
linkNode* node ;
node = (linkNode*)malloc(sizeof(linkNode)) ;
cin >> node->data ;
if(node->data == -1) {
free(node) ;
tmp->next = NULL ;
break ;
}
tmp->next = node ;
tmp = node ;
}
return head ;
}
void print(linkNode* head) {
linkNode* tmp = head->next ;
while(tmp) {
cout << tmp->data << " " ;
tmp =tmp->next ;
}
cout << endl ;
}
void freeNode(linkNode* head) {
linkNode* lin = head->next ;
linkNode * tmp ;
while(lin) {
tmp = lin->next ;
free(lin) ;
lin = tmp->next ;
}
}
void turnBack(linkNode* head) {
linkNode* tmp = head->next ;
linkNode* tt = NULL;
if(tmp) {
tt = tmp->next ;
}
tmp->next = NULL ;
linkNode* ll = tt->next ;
while(1) {
tt->next = tmp ;
tmp = tt ;
tt = ll ;
if(tt == NULL) {
break ;
}
ll = tt->next ;
}
head->next = tmp;
}
int main() {
linkNode* head = createLink() ;
cout <<"逆置前:" << endl ;
print(head) ;
turnBack(head) ;
cout << "逆置后:" << endl ;
print(head) ;
freeNode(head) ;
return 0;
}