题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。
分两种情况:带头结点的链表,不带头结点的链表
#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct node{
int data;
struct node *next;
}Node,*List;
List createListWithHead(int n)//创建带头结点的链表
{
List head = (List)malloc(sizeof(Node));
head->data = 0;
head->next = NULL;
List p = head;
for(int i=0;i<n;i++)
{
List no = (List)malloc(sizeof(Node));
no->data = i+1;
no->next = NULL;
p->next = no;
p = no;
}
return head;
}
List createListWithOutHead(int n)//创建不带头结点的链表
{
if(n==0)
return NULL;
List head = (List)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
List p = head;
for(int i=2;i<=n;i++)
{
List q = (List)malloc(sizeof(Node));
q->data = i;
q->next = NULL;
p->next = q;
p = q;
}
return head;
}
void traverseWithHead(List head)//遍历带头结点的链表
{
if(head == NULL)
return;
List p = head->next;
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
void traverseWithOutHead(List head)//遍历不带头结点的链表
{
if(head == NULL)
return ;
List p = head;
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
void reverseWithHead(List head)//翻转带头结点的链表
{
if(head==NULL ||head->next==NULL)
return;
List p = head->next;
List q = p->next;
while(q)
{
p->next = q->next;
q->next = head->next;
head->next = q;
//p = p->next;
q = p->next;
}
}
//翻转不带头结点的链表,这里注意要带返回值,因为head在函数体内部被改变了。
//而函数体内部的改变,在函数外面是透明的
List reverseWithOutHead(List head)
{
if(head==NULL || head->next==NULL)
return head;
List p = head;
List q = head->next;
while(q)
{
p->next = q->next;
q->next = head;
head = q;
q = p->next;
}
return head;
}
int main()
{
int N = 6;
//带头结点的操作
/*List head = createListWithHead(N);
traverseWithHead(head);
reverseWithHead(head);
traverseWithHead(head);
*/
//不带头结点的操作
List head = createListWithOutHead(N);
traverseWithOutHead(head);
head = reverseWithOutHead(head);
traverseWithOutHead(head);
getchar();
return 0;
}