题目
解法
1.连接法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
* /
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy->next = head;
struct ListNode *p = dummy;
for(int i = 0; i < left-1; i++)
p = p->next;
struct ListNode *pre = NULL, *cur = p->next;
while(1 + (right--) -left)
{
struct ListNode *next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
p->next->next = cur;
p->next = pre;
return dummy->next;
}
2.一次遍历
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
if(left == right)
return head;
struct ListNode *pre = NULL, *next = NULL, *p=head;
struct ListNode *l = NULL, *r = NULL;
int i = 1;
while(p != NULL && i <= right)
{
next = p->next;
if(i == left)
{
l = pre;//记录反转链表的前一个结点
r = p; //记录反转链表要指向的结点
}
if(i >= left)
p->next = pre;
if(i == right)
{
if(l != NULL)
l->next = p;
r->next = next;
if(left == 1)
head = p;
}
pre = p;
p = next;
i++;
}
return head;
}