【笔试】34、反转链表

/****************************************************************************************
 *题目:反转链表
 *		定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。
 *时间:2015年8月30日09:54:30
 *文件:ReverseLink.java
 *作者:cutter_point
 ****************************************************************************************/
package bishi.Offer50.y2015.m08.d30;

import bishi.Offer50.y2015.m08.d26.*;

public class ReverseLink
{
	/**
	 * 反转链表
	 * @param head
	 * @return
	 */
	public LinkNode reverLink(LinkNode head)
	{
		if(head == null)
			return null;
		else if(head != null && head.m_pNext == null)
		{
			return head;
		}//else if
		
		LinkNode front = null;
		LinkNode pNode = head.m_pNext;
		LinkNode reverNode = pNode.m_pNext;
		while(reverNode != null)
		{
			//把我们的当前节点和前一个节点的指向确定,然后把三个节点整体后移一位
			pNode.m_pNext = front;
			front = pNode;
			pNode = reverNode;
			reverNode = pNode.m_pNext;
		}//while
		
		pNode.m_pNext = front;
		reverNode = new LinkNode();
		reverNode.m_pNext = pNode;
		
		return reverNode;
	}
	
	/**
	 * 当我们的第一个节点就是我们要用的节点,也就是不是用一个空的节点作为头结点的方式
	 * @param head
	 * @return
	 */
	public LinkNode reverLink2(LinkNode head)
	{
		LinkNode pReversedHead = null;
		LinkNode pNode = head;
		LinkNode pPre = null;
		while(pNode != null)
		{
			//开始交换指针的方向
			LinkNode pNext = pNode.m_pNext;
			if(pNext == null)
			{
				//下一个节点是空的,说明到了末尾
				pReversedHead = pNode;
			}//if
			pNode.m_pNext = pPre;
			pPre = pNode;
			pNode = pNext;
		}//while
		
		return pReversedHead;
	}
	
	@org.junit.Test
	public void Test()
	{
		LinkList link = new LinkList();
		link.addTail(8);link.addTail(7);link.addTail(6);link.addTail(5);link.addTail(4);link.addTail(3);
		link.addTail(2);link.addTail(1);link.addTail(0);link.addTail(-1);link.addTail(-2);link.addTail(-3);
		
		//逆序输出
		LinkList.PrintListReversingly_Recursively(link.getHead());
		System.out.println();
		//我们反转之后看看输出
		ReverseLink rl = new ReverseLink();
		LinkNode pReverHead = rl.reverLink(link.getHead());
		LinkList.PrintListReversingly_Recursively(pReverHead);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值