每日一题——反转单链表

简介: 每日一题——反转单链表

反转单链表

题目链接

下面主要介绍两种方法:


方法一:

利用三个指针变量进行反转

具体过程如图所示:

注意:循环的结束的条件为cur == NULL而不是next == NULL

实现代码:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* newHead = NULL;
    struct ListNode* cur = head;
    while (cur)
    {
        struct ListNode* curNext = cur->next; //如果next放在循环外面定义,就不好控制循环结束条件
        cur->next = newHead;
        newHead = cur;
        cur = curNext;
    }
    return newHead;
}

方法二:

利用哨兵位实现反转

具体过程如图所示:

注1:循环结束的条件为cur->next == NULL

注2:返回之前要将哨兵位释放,防止内存泄露

实现代码:

struct ListNode* reverseList(struct ListNode* head)
{
    //如果链表为空,直接退出,返回NULL
    if (head == NULL)
        return NULL;
    //创建哨兵为
    struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    newHead->next = head;
    //实现反转
    struct ListNode* cur = head;
    while (cur->next)
    {
        struct ListNode* curNext = cur->next;
        cur->next = curNext->next;
        curNext->next = newHead->next;
        newHead->next = curNext;
    }
    //释放哨兵位,返回新的头
    struct ListNode* retHead = newHead->next;
    free(newHead);
    return retHead;
}
相关文章
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——反转链表
|
6月前
|
算法
【每日一题】牛客网——链表的回文结构
【每日一题】牛客网——链表的回文结构
|
6月前
Leecode之反转链表
Leecode之反转链表
【剑指offer】-反转链表-15/67
【剑指offer】-反转链表-15/67
Leecode206 反转链表
Leecode206 反转链表
41 0
剑指offer 23. 反转链表
剑指offer 23. 反转链表
55 0
【牛客】二叉树遍历
【牛客】二叉树遍历
56 0
leetCode206 - 反转单链表
leetCode206 - 反转单链表
58 0