LeetCode 206. Reverse Linked List(反转链表)

问题描述:
在这里插入图片描述
原题链接:跳转至原题

问题分析:
本题的要求是反转链表。对于一个结点 p 和 p 的后继结点 q ,在反转过后,q 的 next指针指向 p。

问题解法:
对于反转链表问题,给出的通解是:用指针遍历原链表中的每个结点,并在每次访问结点时,完成当前结点与其前一结点的反转。以下将给出递归与非递归两种写法。

代码实现:


#include<iostream>

typedef struct node {
    int val;
    struct node* next;
}ListNode;
//初始化链表
ListNode* buildLinkedList();
//反转链表
ListNode* reverseLinkedList(ListNode* head, ListNode* prev);
//print出链表中每个结点储存的值
void traverseList(ListNode* head);

int main()
{
    ListNode* head = NULL;
    head = buildLinkedList();
    //traverseList(head);
    
    head = reverseLinkedList(head,NULL);
    traverseList(head);
    
    return 0;
}

ListNode* buildLinkedList()
{
    ListNode* head = new ListNode; head->next = NULL;
    ListNode* p = head;
    int val;
    while (scanf("%d",&val) == 1) {
        if (val == -1) break;
        p->next = new ListNode;
        p->next->val = val; p->next->next = NULL;
        p = p->next;
    }
    ListNode* newhead = head->next;
    head->next = NULL;
    delete head;
    return newhead;
}
//递归
ListNode* reverseLinkedList(ListNode* head, ListNode* prev)
{
    //结束条件,表示当前链表已经遍历完成
    if (head == NULL) {
        return prev;
    }
    ListNode* next = head->next;
    head->next = prev;
    //访问下一结点,更新head与prev
    return reverseLinkedList(next,head);
}

/*
//非递归
ListNode* reverseLinkedList(ListNode* head)
{
    ListNode* prev= NULL;
    while (head) {
        ListNode* next = head->next;
        head->next = prev;
        prev = head;
        head = next;
    }
    return prev;
}
*/

void traverseList(ListNode* head)
{
    while (head) {
        printf("%d",head->val); putchar(' ');
        head = head->next;
    }
    putchar('\n');
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值