劍指offer之反轉(zhuǎn)鏈表

1 問題

反轉(zhuǎn)鏈表,比如0->1->2->3反轉(zhuǎn)后變成了3->2->1->0

 
2 分析

搞3個(gè)指針,初始化一個(gè)指針,讓頭結(jié)點(diǎn)指向這里,然后另外一個(gè)指針初始化為NULL,然后讓第一個(gè)節(jié)點(diǎn)指向這里,然后頭結(jié)點(diǎn)依次向右移,這個(gè)初始化為NULL的指針也向右移動(dòng),然后最后當(dāng)頭結(jié)點(diǎn)的next指向NULL的時(shí)候,我們直接返回這個(gè)節(jié)點(diǎn)就行了。

 
3 代碼實(shí)現(xiàn)

    #include <stdio.h>
     
    typedef struct Node
    {
        int val;
        struct Node *next;
    } Node;
     
    /*
     *print list
     */
    void print_list(Node *head)
    {
        if (head == NULL)
        {
            printf("head is NULL\n");
            return;
        }
        Node *p = head;
        while (p != NULL)
        {
            printf("value is %d\n", p->val);
            p = p->next;
        }
    }
     
    /*
     *reverse list
     */
    struct Node* reverse(Node *head)
    {
        if (head == NULL)
        {
            printf("reverse head is NULL\n");
            return NULL;
        }
        Node *end = NULL;
        Node *p = head;
        Node *start = NULL;
        while (p != NULL)
        {
            //next node
            Node *next = p->next;
            //If next is NULL, we will store p, we will return p in the end;
            if (next == NULL)
            {
                end = p;
            }
            p->next = start;
            start = p;
            p = next;
        }
        return end;
    }
     
    int main()
    {
        //0->1->2->3;
        Node head, node1, node2, node3;
        head.val = 0;
        head.next = &node1;
        node1.val = 1;
        node1.next = &node2;
        node2.val = 2;
        node2.next = &node3;
        node3.val = 3;
        node3.next = NULL;
        print_list(&head);
        printf("list will reverse\n");
        Node *hello = reverse(&head);
        print_list(hello);
     
        return 0;
    }


 
4 運(yùn)行結(jié)果

    value is 0
    value is 1
    value is 2
    value is 3
    list will reverse
    value is 3
    value is 2
    value is 1
    value is 0

 


 


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)