力扣算法-Day7

206.反转链表

题意:反转一个单链表。

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

力扣算法-Day7_第1张图片

思路:

        1. 暴力解法:定义一个存储单链表地址的数组,遍历一次赋值,最后再从后往前修改指针;

        2. 双指针:定义两个同类型的指针pre、cur;初始化pre为空,cur为头节点,依次翻转指针。最后cur为空 ,pre指向最后一个。

        3.递归:递归和双指针法的思路一样。只是代码非常简洁。但是不容易懂。

 方法一:(暴力解法)

/**
 * 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* address[5000];
    struct ListNode* cur = head;
    int i;
    for (i=0; cur && cur->next; i++){
        address[i] = cur;
        cur = cur->next;
    }
    i--;
    struct ListNode* p = cur;
    while (i>=0) {
        p->next = address[i];
        p = p->next;
        i--;
    }
    p->next = NULL;
    return cur;
}

方法二:(双指针)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* pre = NULL;
    struct ListNode* cur = head;
    while (cur) {
        struct ListNode* temp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
}

方法三:(递归)

struct ListNode* reverse(struct ListNode* pre, struct ListNode* cur) {
    if(!cur)
        return pre;
    struct ListNode* temp = cur->next;
    cur->next = pre;
    //将cur作为pre传入下一层
    //将temp作为cur传入下一层,改变其指针指向当前cur
    return reverse(cur, temp);
}

struct ListNode* reverseList(struct ListNode* head){
    return reverse(NULL, head);
}

总结: 

 好了,今天就到这里!如果你可以动动手指画个图就会非常容易的理解这道题目!

这一期专栏记录将我每天的刷题,希望各位的监督,也希望和各位共勉。

追光的人,终会光芒万丈!!

你可能感兴趣的:(力扣刷题,算法,leetcode,c#)