定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000
双指针法(迭代法)
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}//构造函数
};
ListNode* create(){
    ListNode *p, *pre, *head;//pre保存当前节点的先驱节点,head为头节点
    head = new ListNode(0);//创建头节点,指针域初始化为NULL
    pre = head;
    for(int i=1; i<5; i++){
        p = new ListNode(i);
        pre->next = p;
        pre = p;
    }
    return head;//返回指针
}
ListNode* reverseList(ListNode* &head){
    ListNode *pre, *cur;
    pre = NULL;
    cur=head;
    //思路,逐一遍历链表,并将当前节点插入第一个位置
    while(cur!=NULL){
        ListNode *q = cur->next;//记录当前节点cur的前驱节点pre,和后继节点q
        cur->next = pre;//反转指针的方向由4->5变成5->4
        pre = cur;//更新
        cur = q;
    }
    return pre;//返回指针
}
int main(){
    ListNode *head = create();
    ListNode *pp = reverseList(head);
    while(pp!=NULL){ 
        printf("%d ", pp->val);
        pp = pp->next;
    }
    return 0;
}
//递归法
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}//构造函数
};
ListNode* create(){
    ListNode *p, *pre, *head;//pre保存当前节点的先驱节点,head为头节点
    head = new ListNode(0);//创建头节点,指针域初始化为NULL
    pre = head;
    for(int i=1; i<5; i++){
        p = new ListNode(i);
        pre->next = p;
        pre = p;
    }
    return head;//返回指针
}

ListNode* recur(ListNode *cur, ListNode *pre){
    if (cur==nullptr) return pre;//终止条件
    ListNode *res = recur(cur->next, cur);
    cur->next = pre; //修改指针指向
    return res;
}
ListNode* reverseList(ListNode* &head){
    // printf("%d\n", recur(head, nullptr)->val);
    return recur(head, nullptr);
}
int main(){
    ListNode *head = create();
    ListNode *pp = reverseList(head);
    while(pp!=NULL){ 
        printf("%d ", pp->val);
        pp = pp->next;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值