链表 206.反转链表

题目

反转一个单链表。

示例

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

题目来源

 

思路

首先看到这道题的话,我第一个会想到的方法是创建一个新的头结点,把老的链表使用头插法,复制过去,这样就形成了一条新的倒序链表。有没有再简单的方法呢?再者的话,就是使用临时的指针,通过迭代的方式来实现。

如1->2->3->4->5->NULL,当2的next指针指向1,2就忘记了它下一个节点是谁?那就麻烦了,必定要用到临时指针来保存3的地址,故使用temp来指向当前节点的下一个节点,用new_node来指向当前节点的上一个节点,head为当前节点。

1(new_node) -> 2(head) -> 3(temp) -> 4 -> 5 -> NULL

temp = head->next;

head->next = new_node;

new_node = head;

head = temp;

1 <- 2(new_node) <- 3(temp,head) -> 4 -> 5 -> NULL

 递归的思路比较难,暂时还不知道怎么解释(留着)。

 

代码实现

1、迭代

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


struct ListNode* reverseList(struct ListNode* head){
    struct ListNode *new_node = NULL,*temp = head;

    while( head != NULL )
    {
        temp = head->next;
        head->next = new_node;
        new_node = head;
        head = temp;
    }
    return new_node;
}

2、递归

 

struct ListNode* reverseList(struct ListNode* head){
    //如果链表为空或者只有一个节点,那么就是本身
    if( head == NULL || head->next == NULL )
    {
        return head;
    }
    //获得head->next之后的翻转链表的头结点
    struct ListNode *res = reverseList( head->next );
    //head->next->next为翻转链表的尾部,指向当前节点
    head->next->next = head;
    //当前节点的尾部指向空
    head->next = NULL;
    //返回翻转链表的头结点
    return res;
}

 

posted @ 2020-07-26 15:04  Rego  阅读(82)  评论(0编辑  收藏  举报