【算法题】反转链表的两种方法

反转单链表的两种办法

方法一:

首先,创建一个与五个元素的单链表,定义三个指针,cur和next分别指向头结点和它的下一个结点,newhead指针来存储新的头结点(newhead初始值为NULL)。

如图:

在这里插入图片描述

第二步,将cur->next指向newhead,再将cur的值赋给newhead,然后cur和next向后移动,此时cur指向数字2,next指向3,如下图:(这一步操作断开了1和2之间的联系,1成为了新的头结点,重复执行此步骤,类似于单链表的头插)

在这里插入图片描述

后面的循环步骤用图片演示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

最后一步,cur指向NULL,循环结束,此时newhead是逆转后的链表的头结点。

下面是具体的代码实现:(不包含该单链表结构体的定义)

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

}

方法二

第二种方法于第一种相比更加容易理解,建立三个指针 n1, n2, n3, n1初始值为NULL,n2为该链表的头结点,n3为n2的下个结点,如下图:
在这里插入图片描述

下一步操作与方法一类似,断开n2和n3之间的联系,让n2指向n1,然后更新n1 ,n2 ,n3,如图:
在这里插入图片描述

然后继续循环操作,直到n2指向NULL结束,n1即为逆转后的链表的头结点。

代码如下:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*n1,*n2,*n3;
    n1=NULl;
    n2=head;
    n3=n2->next;
    while(n2)
    {
        n2-next=n1;
        n1=n2;
        n2=n3;
        if(n3)   //判断n3是否存在,若不存在则无需后续操作
            n3=n3->next;
    }
    return n1;
}
3;
        if(n3)   //判断n3是否存在,若不存在则无需后续操作
            n3=n3->next;
    }
    return n1;
}

最后附上这道题目的leetcode链接:LeetCode逆转单链表(其中有该单链表结构体的具体定义)

猜你喜欢

转载自blog.csdn.net/weixin_43962381/article/details/111247167