给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
来源:力扣(LeetCode)
链接:力扣原题链接
//反转部分链表
ListNode *reverseBetween(ListNode *head, int left, int right)
{
_dummyHead->next=head;//虚头的下个指针指向头
ListNode*pre=_dummyHead;//
for(int i=0;inext;//找到left指向位置的前个位置
}
ListNode*cur=pre->next;
for(int i=0;inext;
//三步走,走完之后移动next指针
cur->next=next->next;
next->next=pre->next;
pre->next=next;
}
return head;
}
代码思路:如图所示:
思路讲解:
设置三个指针,分别为
pre:指向left的前一个节点,该位置不变;
cur:最初指向left的位置,每反转一个元素就会右移一位;
next:最初指向left的下个位置,每反转一个元素就会右移一位;
每次反转就会把next指向的节点,转到pre指向的下个位置;
测试代码:
#includeusing namespace std; class Solution { public: struct ListNode { int val; struct ListNode*next; ListNode(int val):val(val),next(nullptr){} }; //1. 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点 ListNode*addAtHead(int val) { ListNode* newNode = new ListNode(val); newNode->next = _dummyHead->next; _dummyHead->next = newNode; return _dummyHead->next; } //尾插法 ListNode*addeare(int val) { ListNode* newNode = new ListNode(val); ListNode* pre=_dummyHead; while(pre->next!=nullptr) { pre=pre->next; } //退出循环说明pre的下个位置为空,即链表队尾 pre->next=newNode; return _dummyHead->next;//返回头 } // 2.打印链表 void printlinkedList() { ListNode* cur = _dummyHead; while (cur->next != nullptr) { cout << cur->next->val << " "; cur = cur->next; } cout << endl; } //反转部分链表 ListNode *reverseBetween(ListNode *head, int left, int right) { _dummyHead->next=head;//虚头的下个指针指向头 ListNode*pre=_dummyHead;// for(int i=0;i next;//找到left指向位置的前个位置 } ListNode*cur=pre->next; for(int i=0;i next; //三步走,走完之后移动next指针 cur->next=next->next; next->next=pre->next; pre->next=next; } return head; } ListNode* _dummyHead= new ListNode(0); //虚头 }; int main() { // 反转前: 1 2 3 4 5 6 7 8 // 反转后: 1 2 7 6 5 4 3 8 Solution s; s.addeare(1); s.addeare(2); s.addeare(3); s.addeare(4); s.addeare(5); s.addeare(6); s.addeare(7); Solution::ListNode*head=s.addeare(8); s.printlinkedList();//打印反转前数据 Solution::ListNode* ret=s.reverseBetween(head,3,7); s.printlinkedList();//打印反转后数据 // Solution::ListNode*p=ret; // while(p) // { // cout< val<<" "; // p=p->next; // } // cout <



