算法提高之LeetCode刷题

链表翻转

2020-03-18  本文已影响0人  Rehma

基本思路

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

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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读