题目分析:
- 给定一个链表和一个区间的两个值,实现将链表中的该区间节点进行逆转操作。
解题思路:
方法1
找到链表中的m节点和n节点,然后执行reverse函数,将此区间的链表逆转,注意要保存m的前一个节点和n的后一个节点,逆转完成后将链表串接在一起。
方法2
首先直到m节点时,保存m节点的前一个节点pre,然后将m后的节点依次插入到pre的后面即可。
实现程序
// 逆转链表操作函数 void reverseList(struct ListNode *head, struct ListNode *end) { if (head == end) return ; struct ListNode *p = head; struct ListNode *q = p->next; while (q != end) { struct ListNode *r = q->next; q->next = p; p = q; q = r; } q->next = p; } //方法1实现 struct ListNode *reverseBetween1(struct ListNode *head, int m, int n) { if (head == NULL || head->next == NULL || m == n) return head; struct ListNode *p = head; struct ListNode *reserve1 = NULL, *reserve2, *reserve3; //先找到 m - 1位置 int i = 1; while (p != NULL) { if (i == m - 1) { reserve1 = p; } if (i == m) { reserve2 = p; } if (i == n) { reserve3 = p; break; } p = p->next; i++; } p = p->next; //执行逆转操作 reverseList(reserve2, reserve3); // 进行链表挂接 if (reserve1 != NULL) { reserve1->next = reserve3; reserve2->next = p; return head; } else { reserve2->next = p; return reserve3; } } //方法2实现 struct ListNode *reverseBetween(struct ListNode *head, int m, int n) { if (head == NULL || m == n || head->next == NULL) return head; struct ListNode *result = (struct ListNode *) malloc (sizeof(struct ListNode)); result->next = head; struct ListNode *p = result; for (int i = 1; i < m; i++) { p = p->next; } // 找到第m-1个节点 struct ListNode *q = p->next; // 将需要逆转的链表依次插入到m-1节点的后面 for (int i = m; i < n; i++) { struct ListNode *cur = q->next; q->next = cur->next; cur->next = p->next; p->next = cur; } return result->next; }