LeetCode第92题:反转链表 II

题目

在这里插入图片描述

解法

1.连接法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 * /
 struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
    struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->next = head;
    struct ListNode *p = dummy;
    for(int i = 0; i < left-1; i++)
    	p = p->next;
    struct ListNode *pre = NULL, *cur = p->next;
    while(1 + (right--) -left)
    {
    	struct ListNode *next = cur->next;
    	cur->next = pre;
    	pre = cur;
    	cur = next;
    }
    p->next->next = cur;
    p->next = pre;
    return dummy->next;
}

2.一次遍历

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
	if(left == right)
		return head;
	struct ListNode *pre = NULL, *next = NULL, *p=head;
	struct ListNode *l = NULL, *r = NULL;
	int i = 1;
	while(p != NULL && i <= right)
	{
		next = p->next;
		if(i == left)
		{
			l = pre;//记录反转链表的前一个结点
			r = p;  //记录反转链表要指向的结点
		}
		if(i >= left)
			p->next = pre;
		if(i == right)
		{
			if(l != NULL)
				l->next = p;
			r->next = next;
			if(left == 1)
				head = p;
		}
		pre = p;
		p = next;
		i++;
	}	
	return head;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值