每日一题——反转单链表

反转单链表

题目链接

每日一题——反转单链表_第1张图片

下面主要介绍两种方法:


方法一:

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

具体过程如图所示:

每日一题——反转单链表_第2张图片

注意:循环的结束的条件为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;
}

方法二:

利用哨兵位实现反转

具体过程如图所示:

每日一题——反转单链表_第3张图片

注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,算法,c语言)