一、题目描述
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL
二、思路
1.新建一个头节点,用来标记链表头
2.pre指向第m个节点的前一个节点,cur指向第m个节点,让pre的后一个节点指向cur的后一个节点,就完成一次交换(1->3->2->4->5)
3.循环m-n次即达到目的(1->4->3->2->5)
三、C代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n){
if(head == NULL || head->next == NULL || m == n) //特殊情况判断
return head;
struct ListNode *cur;
//新建头节点,并指向原来的头节点,方便标记链表
struct ListNode *head_node = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *pre = head_node;
head_node->next = head;
for(int i = 0; i < m - 1; i++)
{
pre = pre->next;
}
cur = pre->next;
for(int i = 0; i < n - m; i++)
{
struct ListNode *temp = pre->next;
pre->next = cur->next;
cur->next = cur->next->next;
pre->next->next = temp;
}
return head_node->next;
}