1 翻转链表

leetcode link:https://leetcode.cn/problems/reverse-linked-list/description/ 

描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。


 

Notes:

  • 1 添加一个虚拟节点,该虚拟节点指向头结点,用于统一插入和删除操作。
  • 2 while循环内使用cur->next != nullptr 作为判断条件,即头结点到尾节点都存在
  • 3 函数内部主体
    • 记录断链的节点
    • 主体逻辑(链接、插入或者删除)
    • 更新cur指针
  • 4 删除虚拟节点
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* temp; // 保存cur的下一个节点
        ListNode* cur = head;
        ListNode* pre = NULL;
        while(cur) {
            temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur->next = pre; // 翻转操作
            // 更新pre 和 cur指针
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

2 两两交换链表中的几点

leetcode link: https://leetcode.cn/problems/swap-nodes-in-pairs/description/

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
        ListNode* cur = dummyHead;
        while(cur->next != nullptr && cur->next->next != nullptr) {
            // 1 记录断链节点
            ListNode* tmp = cur->next; // 记录临时节点
            ListNode* tmp1 = cur->next->next->next; // 记录临时节点

            // 2 主体逻辑
            cur->next = cur->next->next;    // 步骤一
            cur->next->next = tmp;          // 步骤二
            cur->next->next->next = tmp1;   // 步骤三

            // 3 更新cur指针
            cur = cur->next->next; // cur移动两位,准备下一轮交换
        }
        ListNode* result = dummyHead->next;
        delete dummyHead;
        return result;
    }
};