Reverse Linked List II(LeetCode)

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

将链表中m~n位置的结点反向。

思路1:

首先找到m结点和n结点,然后将m结点依次移到n结点的后面,m结点还指向原来的位置,n结点会前移,直到n结点与m结点相遇,就完成反向了。

注意:1.用一个dummy结点记住头结点;2.找到m的前驱结点pre以便于将m归位。

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
	ListNode* reverseBetween(ListNode* head, int m, int n) {
		if (head == NULL || head->next == NULL)
			return head;
		ListNode dummy(0);
		dummy.next = head;//记住头结点
		ListNode *preM = &dummy;
		ListNode *mNode = head;
		ListNode *nNode = head;
		for (int i = 1; i < m; i++)
		{
			preM = mNode;
			mNode = mNode->next;
		}
		for (int i = 1; i < n; i++)
		{
			nNode = nNode->next;
		}
		
		while (mNode != nNode)
		{
			preM->next = mNode->next;
			mNode->next = nNode->next;
			nNode->next = mNode;
			mNode = preM->next;
		}

		return dummy.next;
	}
};

思路2:

找到m结点及其前驱结点pre,依次将m+1~n的结点与m结点互换位置,需要pre来找到m的位置。

class Solution {
public:
	ListNode* reverseBetween(ListNode* head, int m, int n) {
		if (head == NULL || head->next == NULL)
			return head;
		ListNode dummy(0);
		dummy.next = head;//记住头结点
		ListNode *pre = &dummy;
		ListNode *cur = dummy.next;
		for (int i = 1; i < m; i++)
		{
			pre = cur;
			cur = cur->next;
		}
		for (int i = m; i < n; i++)
		{
			ListNode *temp = cur->next;
			cur->next = temp->next;
			temp->next = pre->next;
			pre->next = temp;
		}
		return dummy.next;
	}
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值