Day.3 LeetCode刷题练习(反转链表)

题目:

例子:

分析题目:

分析题目,因为是一个单链表所以不能找到尾后往前改变,所以不妨换个思路从前往后进行修改链表链接关系

用到三个指针

指针cur指向所要改变的节点链接关系、指针prev指向所要改变节点的前一个节点、指针tail记录所要改变节点的后一个节点

先把cur的链接关系指向prev后把cur往后走继续改变后面的(因为要先改变链接关系,所以有可能找不到后面使用用tail记录下,而prev道理也一样因为不能往回找所以用指针记录一下

有了思路就能写代码了,其中的prev可以先置为NULL

struct ListNode* reverseList(struct ListNode* head) {
    if(head == NULL || head->next == NULL)//对只有一个元素时的情况单独处理
        return head;
    struct ListNode* cur = head , *tail = head->next , *prev = NULL;
    while(cur)
    {
        //思路把数据的链表链接反过来,三指针
        cur->next = prev;//把cur指向prev(prev是前一个位置的空间、当没有前面位置时为NULL也反向代表最后一个位置)
        prev = cur;//把prev指向改变成已经改变链接的节点
        cur = tail;//把cur指向记录好的后面位置
        if(tail)
            tail = tail->next;
    }
    return prev;
}

 官方写法:

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* prev = NULL;
    struct ListNode* curr = head;
    while (curr) {
        struct ListNode* next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

通过比较可总结:

  1. 我们在有相关的多个变量时,可以把相关变量写在循环内,这样就能间接省去改变的过程

猜你喜欢

转载自blog.csdn.net/ZYK069/article/details/131158786