欢迎光临散文网 会员登陆 & 注册

206.反转链表

2023-03-26 11:07 作者:薄荷硬糖酱  | 我要投稿

题目:

206. 反转链表

难度简单3050

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

 

示例 1:

输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]输出:[2,1]

示例 3:

输入:head = []输出:[]

 

提示:

  • 链表中节点的数目范围是 [0, 5000]

  • -5000 <= Node.val <= 5000

 

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

第一种法:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */


struct ListNode* reverse(struct ListNode* cur,struct ListNode* pre){

    if(cur==NULL)return pre;

    struct ListNode *tmp = cur->next;

    cur->next = pre;

    return reverse(tmp,cur);

}

struct ListNode* reverseList(struct ListNode* head){

    return reverse(head,NULL);

}

递归写法,最后记得return

第二种法:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */


struct ListNode* reverseList(struct ListNode* head){

    struct ListNode *tmp;

    struct ListNode *cur;

    struct ListNode *pre;

    cur = head,pre= NULL;

    while(cur){

        tmp = cur->next;

        cur->next = pre;

        pre = cur;

        cur = tmp;

    }

    return pre;

}


迭代写法,先把cur的next保存下来,避免断链


第三种法:

struct ListNode* reverseList(struct ListNode* head){

    struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));

    p->next = NULL;

    struct ListNode *cur = head;

    while(head){

        cur = head->next;

        head->next = p->next;

        p->next = head;

        head = cur;

    }

    return p->next;

}


头插法;

206.反转链表的评论 (共 条)

分享到微博请遵守国家法律