逆置链表

/*
 * 题目:
 *      定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
 *      链表结点定义如下
 *
 * 问题:
 *      1. 单向链表的遍历
 *
 * 思路:
 *      1. 取出第一个结点和第二个结点,将第一个结点的后继结点设置为 null
 *      2. 取出链表中两个相邻的结点 A、B
 *         tmp = B.next
 *         B.next = A
 *         A = B
 *         B = tmp
 *         直到 B 结点为空
 */

#include <iostream>
#include <stdlib.h>

using namespace std ;

typedef struct link {
    int data ;
    struct link* next ;
} linkNode ;


linkNode* createLink() {
    linkNode* head = NULL ;
    head = (linkNode*)malloc(sizeof(link)) ;
    linkNode*tmp=head ;
    while(1) {
        linkNode* node ;
        node = (linkNode*)malloc(sizeof(linkNode)) ;
        cin >> node->data ;
        if(node->data == -1) {
            free(node) ;
            tmp->next = NULL ;
            break ;
        }
        tmp->next = node ;
        tmp = node ;
    }
    return head ;
}

void print(linkNode* head) {
    linkNode* tmp = head->next ;
    while(tmp) {
        cout << tmp->data << " " ;
        tmp =tmp->next ;
    } 
    cout << endl ;
}

void freeNode(linkNode* head) {
    linkNode* lin = head->next ;
    linkNode * tmp ;
    while(lin) {
        tmp = lin->next ;   
        free(lin) ;
        lin = tmp->next ;
    }  
    
}

void turnBack(linkNode* head) {
    linkNode* tmp = head->next ;
    linkNode* tt = NULL;
    if(tmp) { 
        tt = tmp->next ;
    }
    tmp->next = NULL ;
    linkNode* ll = tt->next ;
    while(1) {
        tt->next = tmp ;
        tmp = tt ;
        tt = ll ;
        if(tt == NULL) {
            break ;
        }
        ll = tt->next ;
    }   
    head->next = tmp;
}

int main() {
    linkNode* head = createLink() ;
    cout <<"逆置前:" << endl ;
    print(head) ;
    turnBack(head) ;
    cout << "逆置后:" << endl ;
    print(head) ;
    freeNode(head) ;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值