将单链表逆置*

有一个不带头结点的单链表L(至少有1个结点),
第一个结点指针为head,编写算法将L逆置,
即最后一个结点变成第一个结点,倒数第二个结点变成第二个结点,如此等等。

 

#include<stdio.h>
#include<stdlib.h>

//链表中节点的结构
typedef struct Link {
    int  data;
    struct Link* next;
}link;

//链表初始化
link* initByTailInsert(link* phead) {
    link* first_node = (link*)malloc(sizeof(link));//创建第一个节点
    //第一个结点先初始化
    first_node->data = 1;
    first_node->next = NULL;
    phead = first_node;//头指针指向第一个节点

    //尾插入赋值
    for (int i = 2; i < 10; i++) {
        link* new_node = (link*)malloc(sizeof(link)); //申请新的结点
        new_node->data = i;
        new_node->next = NULL;
        first_node->next = new_node;  //第一个结点的指针域指向这个新申请的结点
        first_node = new_node;  //第一个结点后移
    }

    //printf("头指针指向的值是:%d\n", phead->data);//1
    return phead;  //将指向第一个结点的头指针返回
}


link* reverseLink(link* phead){
    link* p = NULL; 
    link* q = phead; //q指向当前被改变指针域的结点
    while (q != NULL) {
        phead = phead->next;
        q->next = p;
        p = q;
        q = phead;
    }
    phead = p;
    return phead;
}


void showLink(link* phead) {
    link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针
    //只要tmp指针指向的结点的next不是Null,就执行输出语句。
    while (tmp != NULL) {
        printf("%d ", tmp->data);
        tmp = tmp->next;
    }
    printf("\n");
}

void main() {
    link* myhead = NULL;
    myhead = initByTailInsert(myhead);//创建头指针,得到经过初始化后的头指针
    printf("初始化链表为:\n");
    showLink(myhead);
    printf("将单链表逆置后:\n");
    myhead = reverseLink(myhead);
    showLink(myhead);
}

 

posted @ 2020-04-14 10:52  shanlu  阅读(482)  评论(0编辑  收藏  举报