例题描述
给定单链表的某一段区间,即传参为某两个节点,反转两节点区间之内的所有节点,对于区间外的节点不需操作。
传参保证节点a
对于节点b
,一定在链表的上游。
示例:
-
对于某一链表:
1->2->3->4->5->NULL
,入参为节点值为2
和5
的节点地址a
和b
,调用完成后结果为: -
输出:
5->4->3->2
结构体定义
struct ListNode {
int val;
struct ListNode *next;
};
解题思路
此题目与反转一个单链表思路相同,只是循环终止条件发生了改变:
- 反转单链表终止条件为节点不为空,所以循环遍历链表,如果为空则跳出。
- 局部反转单链表终止条件为节点不相等,从前向后遍历,遍历到达后边节点后跳出。
循环区间为左闭右开:[a, b)
代码实现
struct ListNode *reverse(struct ListNode * a, struct ListNode * b) {
struct ListNode *node, *newHead = NULL;
while (a != b) {
node = a;
a = a->next;
node->next = newHead;
newHead = node;
}
return newHead;
}