链表反转

关于链表反转的问题,经典面试问题吧~值得仔细推敲和琢磨的

题目http://www.nowcoder.com/books/coding-interviews/75e878df47f24fdc9dc3e400ec6058ca?rp=1

思路1:

使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。

p = head;

q = head->next;


head->next = NULL;


现在进入循环体,这是第一次循环。

r = q->next;

q->next = p;


p = q;

q =r;


第二次循环。

r = q->next


q->next = p;    


p = q;


q = r


第三次循环。。。。。

下面是根据这个思路,自己写的代码;

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
	ListNode(){}
};

ListNode *ReverseList(ListNode *pHead)
{
	if (pHead == NULL)//链表为空的情况
	{
		return NULL;
	}
	else if (pHead->next == NULL)
	{
		return pHead;
	}
	else
	{
		
		ListNode *p = pHead;
		ListNode *q = pHead->next;
		pHead->next = NULL;
		ListNode *r = q->next;
		while (q)
		{
			r = q->next;
			q->next = p;
			p = q;
			q = r;
			//r = r->next;
		}
		pHead = p;
		return p;
	}
}

思路2:不改变链表结构

使用栈结构;或者用递归的思想(注意理解栈结构和递归的想通之处)详细看《剑指offer》P51-52

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值