2018年2月21日 星期三

[206] Reverse Linked List

linked list反轉
其實真的是很基本的題目 QQ
不過我寫的好像贅步很多啊奇怪XD
別人的迴圈怎麼只要四行呢 XD
但是這次submit 之後竟然是0ms 吶擊敗全部人的速度吶
雖然明知是bugXD 也沒有比較的意義XD
還是存檔紀念一下哈哈哈
(果然第二次跑就要4ms了噗)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode *p0, *p1, *p2;
    p0 = NULL;
    p1 = head;
    p2 = p1->next;
    while (p2 != NULL)
    {
        struct ListNode* tmp;
        tmp = p2->next;
        p1->next = p0;
        p2->next = p1;
        p0 = p1;
        p1 = p2;
        p2 = tmp;
    }
    p1->next = p0;
    return p1;
}

改了一下, 也可以四行處理完了, 開薰!!!
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode *p0, *p1, *p2;
    p0 = NULL;
    p1 = head;
    p2 = p1->next;
    while (p2 != NULL)
    {
        p1->next = p0;
        p0 = p1;
        p1 = p2;
        p2 = p2->next;
    }
    p1->next = p0;
    return p1;
}

20230617 更新
與時俱進~發現有更精簡的寫法XD
之一是要處理最後一步,如果是上面的寫法,在離開迴圈後要記得把最後一個pointer 再往前指;如果是下面的寫法,因為往回指的部份已經寫在迴圈裡了,那就變成回傳的ptr會變成前中後的前,因為他們已經往後shift 了!!! 真是眉角很多啊QQ

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* p1, *p2, *p3;
    if (head == NULL || head->next==NULL)
        return head;
    p1=NULL;
    p2=head;
    p3=NULL;
    while(p2 != NULL)
    {
        p3=p2->next;
        p2->next=p1;
        p1=p2;
        p2=p3;
    }
    return p1;
}

20230816 再次更新
面試又GG了,竟然還是忘記把最後一根往回指XD 我真的是對我自己很失望T—T
改成 pre , cur, 跟next 的寫法,感覺比較容易看懂 ?!
struct ListNode* reverseList(struct ListNode* head){
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode *pre , *cur, *next;
    pre = NULL;
    cur = head;
    next = head->next;
    while (next != NULL)
    {
        cur->next = pre;
        pre = cur;
        cur = next;
        next=next->next;
    }    
    cur->next = pre;
    return cur;
}

(每次回圈裡處理QQ)
struct ListNode* reverseList(struct ListNode* head){
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode *pre , *cur, *next;
    pre = NULL;
    cur = head;
    next = head->next;
    while (cur != NULL)
    {
        next = cur->next;
        cur->next = pre;
        pre = cur;
        cur = next;
    }    
    return pre;
}

「20240130再再次更新」

不得了,我已經可以越寫越少行了XD 我真是對我自己的進步感到很感動(痛哭流涕)
雖然厲害的offer還是都無法到我身邊啊嗚嗚嗚嗚嗚
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/

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


沒有留言:

張貼留言