Leetcode ☞ 206. Reverse Linked List ☆

来源:互联网 发布:冠趣网络 编辑:程序博客网 时间:2024/06/18 10:37

206. Reverse Linked List

Total Accepted: 88622 Total Submissions: 230653 Difficulty: Easy

Reverse a singly linked list.






本文介绍三种方法,两种非递归,一种递归。

我的AC:(思路:从前往后把每一个点,都放在一个NULL之前)

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */struct ListNode* reverseList(struct ListNode* head) {    struct ListNode *p1, *p2, *p;    p1 = NULL;    p2 = head;        while(p2){        p = p2->next;        p2->next = p1;        p1 = p2;        p2 = p;    }    head = p1;// while结束时,P跟P2都是NULL的哟~    return head;}


另一个方法,(思路:从前往后,从第二个点开始把每一个点都放在当前头结点之前)

【注意!!while循环条件也不同了!】

struct ListNode* reverseList(struct ListNode* head) {      struct ListNode *pCurr, *pNext;      pCurr = head;            while (pCurr->next != NULL){          pNext = pCurr->next;          pCurr->next = pNext->next;          pNext->next = head;          head = pNext;      }      return head;  }  

注意点:pCurr一直指的是a1,不变


高端的=。=递归法(不含头结点版):

struct ListNode* reverseList(struct ListNode* head) {    if(head == NULL || head->next == NULL)        return head;        struct ListNode *newHead = reverseList(head->next);    head->next->next = head;    head->next = NULL;    return newHead;}

太酷了。

head为指向非空单链表中第一个结点的指针,本算法逆转链表并返回逆转后的头指针newHead。

基本思路是:如果链表中只有一个结点,则空操作;否则先逆转a2开始的链表,然后将 a1【head】接在逆转后的链表的表尾(即a2)后面【a2是head->next ,a2之后就是head->next->next】。


0 0
原创粉丝点击