链表翻转

作者: Rehma | 来源:发表于2020-03-18 17:51 被阅读0次

    基本思路

    从前往后遍历链表,定义三个指针分别指向相邻三个结点。
    反转前两个结点,即让第二个结点指向第一个结点。
    然后依次往后移动指针,直到第二个结点为空循环结束。
    最后再处理链表头尾即可。

    listNode.png

    代码实现

    //节点定义 
    struct ListNode {
        int val;
        ListNode *next;
        ListNode (int _val):val (_val),next (nullptr) { }
    };
    
    ListNode* ReverseList(ListNode *head){
        if (head == nullptr || head->next == nullptr){
          return head;
        }else{
            
            ListNode *p1 = head;
            ListNode *p2 = p1->next;
            ListNode *p3 = p2->next;//p3为了记录p2后的节点是否为空
            
            while (p2) {
                p3 = p2->next;
                p2->next = p1;
                p1 = p2;
                p2 = p3;
            }
    
            head->next = nullptr;
            head = p1;
            return head;
        }
    }
    

    相关文章

      网友评论

        本文标题:链表翻转

        本文链接:https://www.haomeiwen.com/subject/ryycyhtx.html