给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]
提示:
链表中节点数目为 n1 <= n <= 500-500 <= Node.val <= 5001 <= left <= right <= n
以下程序实现了这一功能:
#include#include struct ListNode { int val; struct ListNode *next; }; static struct ListNode *reverseBetween(struct ListNode *head, int m, int n) { int i; struct ListNode dummy; struct ListNode *prev = &dummy; prev->next = head; for (i = 1; i < m; i++) { prev = prev->next; } struct ListNode *p = prev->next; for (i = m; i < n; i++) { struct ListNode *q = p->next; p->next = q->next; q->next = prev->next; prev->next = q; } return dummy.next; } int main(int argc, char **argv) { if (argc < 3) { fprintf(stderr, "Usage: ./test m n 1 2 3...n"); exit(-1); } int i, count = argc - 3; struct ListNode dummy; struct ListNode *prev = &dummy; struct ListNode *p; for (i = 0; i < count; i++) { p = malloc(sizeof(*p)); p->val = atoi(argv[i + 3]); p->next = NULL; prev->next = p; prev = p; } int m = atoi(argv[1]); int n = atoi(argv[2]); struct ListNode *head = reverseBetween(dummy.next, m, n); for (p = head; p != NULL; p = p->next) { printf("%d ", p->val); } printf("n"); return 0; }



