链表的翻转
穿针引线法
基本思想:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。
具体实现:使用三个指针变量 pre、cur、cur_next 来记录反转的过程中需要的变量:
cur:指向待反转区域的第一个节点 left;
cur_next:永远指向 cur 的下一个节点;
pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。
具体步骤:
(图片来源:力扣官方题解)
步骤:
- 先将 cur 的下一个节点记录为cur_ next;
- 把 cur 的下一个节点指向 cur_next 的下一个节点;
- 把 cur_next 的下一个节点指向 pre 的下一个节点;
- 把 pre 的下一个节点指向 cur_next。
例题:https://leetcode-cn.com/problems/reverse-linked-list-ii/
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode* dummyNode=new ListNode(-1);
dummyNode->next=head;
ListNode* pre=dummyNode;
for(int i=0;i<left-1;i++)
pre=pre->next;
ListNode* cur=pre->next;
ListNode* cur_next=NULL;
for(int i=0;i<right-left;i++){
cur_next=cur->next;
cur->next=cur_next->next;
cur_next->next=pre->next;
pre->next=cur_next;
}
return dummyNode->next;
}