一次遍历反转链表

来源:互联网 发布:10天学会单片机 编辑:程序博客网 时间:2024/06/11 16:59

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。

分两种情况:带头结点的链表,不带头结点的链表


#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;}