解题思路
核心思路是借助临时头结点,找到需要翻转链表的前驱位置,然后将要翻转链表的结点摘下进行子链表的头部插入即可。
对下列链表 m=2 n=4 进行链表翻转。
借助临时头结点(解决m=1的问题)
翻转链表的前驱结点
head指向翻转链表头结点
C语言实现:
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
// 0/1个结点
if(head == NULL || head->next == NULL || m==n) return head;
// 带头结点
struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));
newhead->next = head;
struct ListNode* prev = newhead;
for(int i = 1; i < m; ++i)
{
prev = prev->next;
}
// head指向子链头部
head = prev->next;
for(int i = m; i < n; ++i)
{
// p结点摘下头插
struct ListNode* p = head->next;
head->next = p->next;
p->next = prev->next;
prev->next = p;
}
head = newhead->next;
free(newhead);
return head;
}