之前写的代码我实在看不下去了,因为刚才看的时候已经有些地方一下子看不懂了,
总的来说就是太多的特殊处理,虽然不得不这样做,试着给单链表加了个头节点,
代码简洁多了,强烈建议链表的删除,插入和反转都加上个头节点!!
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
if (!head || !head->next || n == m) return head;//预处理
struct ListNode *L = (struct ListNode *)malloc(sizeof(struct ListNode));
L->next = head; //删除节点常用手段考虑加个头指针
struct ListNode* pre = NULL;
struct ListNode* p = L;
int temp_m = m;
int temp_n = n;
//将p转移到反转链表的第一个节点,pre保存前一个节点
while (temp_m-- >= 1) {
pre = p;
p = p->next;
}
struct ListNode* reverse_head = NULL;
struct ListNode* reverse_tail = p;
struct ListNode* reverse_tail_after = NULL;
struct ListNode* q = NULL;
//进行反转
while (temp_n - m > 0) {
q = p->next;
reverse_tail_after = q->next;
p->next = reverse_head;
reverse_head = p;
p = q;
temp_n--;
}
p->next = reverse_head;
reverse_head = p;
pre->next = reverse_head;
reverse_tail->next = reverse_tail_after;
return L->next;
}
欢迎大家评论!!!
具体不同之处请参见我之前写的博客!!!