24反转链表

题目描述:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

 

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

代码:

迭代法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


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

 

总结:

三种方法:

①利用外部空间

申请一个动态扩容的数组,将整个链表中的值存入数组或者容器中,然后反向取出

但是这种方法空间复杂度高,不是一种很好的方法

②双指针迭代

定义两个指针,一个pre,一个cur,以及一个tmp临时变量,用来保存cur->next的值

循环结束的条件是cur指向为空,则pre当前指向的元素就是反转链表要返回的元素

③递归解法:

递归法代码不会写

原文地址:https://www.cnblogs.com/redzzy/p/13359100.html