由于小编能力有限,递归反转链表还没整理,下面是一些常规反转写法
1.:206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)
使用头插法,后面的每一个节点都插到前一个节点前
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr) return head;
ListNode * p = nullptr;
ListNode * c = head;
while (c != nullptr){
ListNode * nextTemp = c->next; // 保存下一个节点,用来遍历
c->next = p; // 下一个节点插在该节点前
p = c; // p一直在更新
c = nextTemp;
}
return p ;
}
};
2:92. 反转链表 II - 力扣(LeetCode) (leetcode-cn.com)
穿针引线法:
依次得到反转
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(head == nullptr || head->next == nullptr) return head;
ListNode * node = new ListNode(0);
node->next = head;
ListNode * pre = node;
for(int i = 0 ; i < left - 1 ; i++) pre = pre->next; // 得到反转位置的前一个节点
ListNode * curr = pre->next;
ListNode * next;
for(int i = 0 ; i < right - left ; i++){
next = curr->next;
curr->next = next->next;
next->next = pre->next;
pre->next = next; //pre只能最后更新
}
return node->next;
}
};