力扣206. 反转链表

题目:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
力扣206. 反转链表_第1张图片
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
力扣206. 反转链表_第2张图片
输入:head = [1,2]
输出:[2,1]
示例 3:

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

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

分析:

本道题,需要考虑两种情况:
**第一种:**链表为空,反转链表依然是一个空链表。
**第二种:**链表不为空,需要反转:

定义三个指针n1,n2,n3,分别指向NULL,head,head->next

力扣206. 反转链表_第3张图片

通过n2来遍历链表,n3先到结尾,为空时,此时链表还没有遍历结束,还没有实现全部反转

实现反转:n2->next=n1

力扣206. 反转链表_第4张图片
将n1移到n2的位置,n2移动到n3的位置,n3往后移动一个节点

力扣206. 反转链表_第5张图片

n2还不为空,继续遍历,先反转:n2->next=n1

力扣206. 反转链表_第6张图片

将n1移到n2的位置,n2移动到n3的位置,n3往后移动一个节点
力扣206. 反转链表_第7张图片
重复此操作,直到n2为空时:
力扣206. 反转链表_第8张图片

这里需要注意一下:当n2下一个为空时,此时n3已经为空,n3->next也是空,此时n3已经不需要,因此,需要判断一下n3为不为空。

遍历结束后,返回n1即可

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode*n1,*n2,*n3;
    n1=NULL;
    n2=head;
    n3=head->next;
    while(n2)
    {
        n2->next=n1;

        n1=n2;
        n2=n3;
        if(n3)
        {
            n3=n3->next;
        }
    }
    return n1;
}

你可能感兴趣的:(oj练习,leetcode,链表,算法)