链表的题都挺简单的。
使用一趟扫描就可以实现,不过要记录的中途节点有点多,需要记录left的前一个、left所在的元素,循环中要记录三个元素,每次循环第二个元素指向第一个元素,随后三个元素向后移动。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {if(left==right) return head;ListNode *h = new ListNode(0,head);ListNode *result=h;for(int i=0;i<left-1;i++) h=h->next;ListNode *hh=h->next;ListNode *a=hh->next;ListNode *b=a->next;a->next=hh;ListNode* c=a;for(int i=left;i<right-1;i++){c=a;a=b;b=b->next;a->next=c;}h->next=a;hh->next=b;return result->next;}
};
链表题目都需要注意,在开始时最好设一个“开始的开始”在head前面,这样就会方便很多。