链表逆序

来源:互联网 发布:东华软件数据库 编辑:程序博客网 时间:2024/06/01 10:09

原文地址:http://blog.csdn.net/niuer09/article/details/5961004

设链表节点为:

typedef struct tagListNode{    int data;    struct tagListNode* next;}ListNode, *List;

要求将一带链表头List head的单向链表逆序。

分析:

  1). 若链表为空或只有一个元素,则直接返回;

  2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;

  3). 重复2),直到q为空

  4). 调整链表头和链表尾

示例:以逆序A->B->C->D为例,图示如下

 

实现及测试代码如下:

#include <stdio.h>#include <stdlib.h>typedef struct tagListNode{    int data;    struct tagListNode* next;}ListNode, *List;void PrintList(List head);List ReverseList(List head);int main(){    //分配链表头结点    ListNode *head;    head = (ListNode*)malloc(sizeof(ListNode));    head->next = NULL;    head->data = -1;    //将[1,10]加入链表    int i;    ListNode *p, *q;    p = head;    for(int i = 1; i <= 10; i++)    {        q = (ListNode *)malloc(sizeof(ListNode));        q->data = i;        q->next = NULL;        p->next = q;        p = q;            }    PrintList(head);           /*输出原始链表*/    head = ReverseList(head);  /*逆序链表*/    PrintList(head);           /*输出逆序后的链表*/    return 0;}List ReverseList(List head){    if(head->next == NULL || head->next->next == NULL)      {       return head;   /*链表为空或只有一个元素则直接返回*/    }    ListNode *t = NULL,             *p = head->next,             *q = head->next->next;    while(q != NULL)    {              t = q->next;      q->next = p;      p = q;      q = t;    }    /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/    head->next->next = NULL;  /*设置链表尾*/    head->next = p;           /*调整链表头*/    return head;}void PrintList(List head){    ListNode* p = head->next;    while(p != NULL)    {        printf("%d ", p->data);        p = p->next;    }    printf("/n");}

	
				
		
原创粉丝点击