LeetCode 92. 反转链表 II | C语言版
LeetCode 92. 反转链表 II
题目描述
题目地址:92. 反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
解题思路
思路一:使用
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
//反转链表中指定的一段left-right
//创建虚拟节点(哨兵),指向head(减少边界判断)
struct ListNode* dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));
dummyHead->next=head;
struct ListNode* hh=dummyHead;
//dummyHead->...->left->...->right->...
right=right-left;
//1.将hh移动到left的前一位置
while(left>1){
left--;
hh=hh->next;
}
//2.使用pre,cur指定将指定链表段left-right的节点指针域反转
//pre当前节点的前驱节点
struct ListNode* pre=hh->next;
//cur当前节点
struct ListNode* cur=pre->next;
//dummyHead->...->hh->left(pre)->cur->...->right->...
while(right>0){
right--;
//保存要反转节点cur的下一个节点
struct ListNode* temp=cur->next;
//反转
cur->next=pre;
//更新指针位置,pre,cur都右移动一位
pre=cur;
cur=temp;
}
//dummyHead->...->hh->left<-...<-right(pre)->cur->...
//3.最后将反转好的链表段left-right头尾大反转
//left->cur(即right后继)
hh->next->next=cur;
//hh(即left前驱)->right
hh->next=pre;
//dummyHead->...->hh->right->...->left->cur->...
return dummyHead->next;
}
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片