方法1 创建新的虚拟头节点(创建一个新的链表)依次遍历原有链表 将遍历节点依次头插入新链表 即可实现链表反转 返回值为dummy->next
class Solution {
public:
ListNode* reverseList(ListNode* head) {
while (head == NULL){
return NULL;
}
ListNode *dummy = new ListNode(0);
while (head != NULL){
ListNode *temp = head->next;
head->next = dummy->next;
dummy->next = head;
// 头插法 先将head下一个连接到dummy的下一个上 再将dummy->next指向head
// 为什么是这个顺序 详情见后面链接
// 这里是对head进行操作 做的操作是把head头插到链表中
head = temp;
// head = temp 依次向后一个
}
return dummy->next;
// 返回新的链表 为dummy->next
}
};
方法2 递归思想
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
// 第一种情况 如果链表是空的 或链表只有head自己 那么就直接返回自己
ListNode* last = reverseList(head->next);
// 不要跳进递归 单独看这一句 得到的结果是last这个链表 该链表是
head->next->next = head;
// head->next 的下一个重新指向现在的head 相当于把链表顺序修正 配合图更好理解
head->next = nullptr;
// head下一个为空 让链表完整
return last;
// 输出last 即为翻转后的链表
}
};
参考:
相关知识学习: