[LeetCode] Reverse Linked List II

题目链接:http://oj.leetcode.com/problems/reverse-linked-list-ii/

题目内容:

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.


这问题就是把一个链表的m---n位倒序,

乍一看就照着四个指针开始写了,一个*phead指向m的前一结点,*pend指向n的后一结点,

对于逆转单向链表同时需要三个指针*pi,*pj,*pend从*pstart开始,依次调转。

(ps:这个题很久以前貌似看过。)

没仔细想就开始写,写完了,突然考虑特殊情况,比如m=1,n=end,相当于把整个链表调换,这样pstart和pend就会为空,这样就要处理好多种特殊情况啊。。。突然灵光一闪(好像以前看过类似解法):

在原始列表的头尾各加一个结点,如:

myhead->1->2->3->4->5->mytail->NULL

这样只需要处理链表长度为1和m==n的情况了!


代码虽然可读性不是特别强。但是还是放上来吧,希望对有些同学有帮助~

class Solution {
public:
    ListNode *reverseBetween(ListNode *head, int m, int n) {
        ListNode *pstart,*pi,*pj,*pend;
		ListNode mystart(0),myend(0);
		//int count=1;
		if (head->next==NULL || m==n)
			return head;

		//add head,tail
		pstart=&mystart;
		mystart.next=head;
		pend=head;
		while (pend->next){
			//count++;
			pend=pend->next;
		}
		pend->next=&myend;
		m++;n++;

		//find pstart
		for (int i=2;i<m;i++){
			if (pstart->next!=NULL)
				pstart=pstart->next;
		}

		//init pi,pj,pend;
		pi=pstart;
		if (pi->next!=&myend)
			pj=pi->next;
		if (pj->next!=&myend)
			pend=pj->next;
		
		pj->next=NULL;
		for (int i=m;i<n;i++){
			pi=pj;
			pj=pend;
			pend=pend->next;
			pj->next=pi;
		}
		pstart->next=pj;
		while (pi->next)
			pi=pi->next;
		if (pi->next!=&myend){
			pi->next=pend;
			while (pi->next!=&myend)
				pi=pi->next;
			pi->next=NULL;
		}
			
		return mystart.next;
    }
};




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值