Leetcode:迭代方法和头插方法反转链表

本小妞迷上赌 提交于 2020-12-18 13:11:30

Leetcode:反转链表

示列:输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
一、迭代方法反转链表。
迭代是通过将1->2->3->4->5->NULL,一个个反转得到NULL<-1<-2<-3<-4<-5;
在进行迭代时我们需要定义三个结构体指针: n1 (表示要反转的前一个结点),n2(表示要反转的结点),n3(表示要反转的下一个结点);
n1的存在是为了让n2指向它,形成反转,n3是为了保存下一个结点的地址,否则,当反转一个后,链表会断开。
画图理解一下:
在这里插入图片描述代码实现如下:






typedef struct ListNode Node;
struct ListNode* reverseList(struct ListNode* head){
   
   
 if(head==NULL||head->next==NULL)//链表如果是一个或者NULL不用反转,直接返回。
    {
   
   
        return head;
    }
    Node*n1=NULL;//头的前一个
    Node*n2=head;//头
    Node*n3=head->next;//头的下一个
  
    while(n2)
    {
   
     
        //反转,
        n2->next=n1;//让头指向NULL
        n1=n2;//向后走
        n2=n3;
        if(n3)//如果n3为空,n3就不能在想向后移动。
         n3=n3->next;
        
    }
    return n1;

二、头插,反转链表。
先新定义一个结构体指针 头(newHead),保存链表的头(cur),保存链表的头的下一个(next);
把链表从左到右 头插到 新的头 上;
如图所示:在这里插入图片描述代码如下:


typedef struct ListNode Node;
struct ListNode* reverseList(struct ListNode* head){
   
   
    Node*cur=head;
    Node*newHead=NULL;
    while(cur)
    {
   
   
        Node*next=cur->next;//随着cur向后走,next也在向后走。
        //头插cur当作新结点
        cur->next=newHead;//头插
        newHead=cur;//更新头
        cur=next;//向后走
    }
    return newHead;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!