c语言单链表反转

单链表反转可用迭代法,也可用递归方法,这里用迭代法(循环)实现。

示意图如下,其中pre指前一个节点,cur指当前节点,temp为临时节点。

主要思路就是让当前节点指向前一个节点,即cur->next=pre,需要事前将cur->next赋值给temp。然后下移即可。

#include <stdio.h>
typedef struct node_s {
    int item;
    struct node_s* next;
}node_t,*link;

//新建节点
link newNode(int item) {
    link new = malloc(sizeof(node_t));
    new->item = item;
    new->next = NULL;
    return new;
}

link Reverse(link header){
    if (header == NULL || header->next == NULL)    {
        return header;}
    link pre; //前一个
    link cur; //当前
    link temp;//临时变量
    pre = header;
    cur = header->next;
    pre->next = NULL;

    while (cur != NULL)
    {
        temp = cur->next; //注意顺序不要错
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
}

void printLink(node_t* header){
    while (header != NULL){
        if (header->next != NULL){
            printf("%d->", header->item); //不是最后一个
        }
        else{
            printf("%d", header->item);
        }
        header = header->next;
    }
    printf("\n");
}
int main(int argc, char* argv[]){
    //创建单向链接
    node_t *header = NULL, *cur = NULL;
    for (int i = 1; i <= 3; ++i) {
        node_t* new = newNode(i);
        if (header == NULL){
            header = new;
        }
        else{
            cur->next = new;  //加到后面
        }
        cur = new;
    }

    printLink(header); //打印链表
    auto newHeader = Reverse(header);  //auto关键字,只用在赋值语句中
    printLink(newHeader);
    system("pause");
}

猜你喜欢

转载自www.cnblogs.com/imhuanxi/p/11919711.html
今日推荐