/****************************************************************************************
*题目:反转链表
* 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。
*时间: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);
}
}
【笔试】34、反转链表
最新推荐文章于 2024-02-05 17:20:54 发布