【笔试】23、实现链表

节点类


/**
 *题目:实现链表
 *时间:2015年8月26日09:39:31
 *文件:LinkNode.java
 *作者:cutter_point
 */
package bishi.Offer50.y2015.m08.d26;

public class LinkNode
{
	public int m_nValue;
	public LinkNode m_pNext;
	public LinkNode()
	{
	}
	
	public LinkNode(int d)
	{
		m_nValue = d;
		m_pNext = null;
	}

	public LinkNode(int data, LinkNode next)
	{
		this.m_nValue = data;
		this.m_pNext = next;
	}
}

链表类

/**
 *题目:实现链表
 *时间:2015年8月26日09:39:31
 *文件:LinkNode.java
 *作者:cutter_point
 */
package bishi.Offer50.y2015.m08.d26;

import bishi.Offer50.y2015.m08.d26.LinkNode;
import java.util.Stack;

public class LinkList
{
	private LinkNode head;	//头结点
	
	public LinkList()
	{
		//构造函数创建头结点
		head = new LinkNode();
	}
	
	/**
	 * 在链表末尾添加一个节点
	 * @param data
	 */
	public void addTail(int data)
	{
		LinkNode newNode = new LinkNode(data);
		if(head == null || head.m_pNext == null)
		{
			if(head == null)
			{
				head = new LinkNode();
			}
			
			head.m_pNext = newNode;
		}//if
		else
		{
			LinkNode p = head.m_pNext;
			while(p.m_pNext != null)
			{
				p = p.m_pNext;
			}//while
			p.m_pNext = newNode;
		}//else
	}
	
	/**
	 * 移除链表中的第一个data
	 * @param data
	 * @throws Exception 
	 */
	public int removeNode(int data) throws Exception
	{
		if(head == null)
			return -1;
		
		LinkNode p = head, q = p.m_pNext;
		while(q != null)
		{
			if(q.m_nValue == data)
				break;
			else
			{
				p = q;
				q = q.m_pNext;
			}//else
		}//while
		
		if(q == null)
			throw new Exception("找不到数据");
		
		p.m_pNext = q.m_pNext;
		q.m_pNext = null;
		return q.m_nValue;
	}
	
	/**
	 * 在链表中找到第一个出现data的位置,是链表中的第几个节点(包括头结点)
	 * @param data
	 * @return
	 */
	public LinkNode findNode(int data)
	{
		LinkNode p = head;
		while(p != null)
		{
			if(p.m_nValue == data)
			{
				break;
			}//if
			else
			{
				p = p.m_pNext;
			}//else
		}//while
		
		if(p == null)
		{
			return null;
		}//if
		
		return p;
	}
	
	public LinkNode getHead()
	{
		return head;
	}

	/**
	 * 我们借助栈,逆序打印链表
	 * @param link
	 */
	public static void PrintListReversingly_Iteratively(LinkList link)
	{
		if(link == null || link.head == null)
			return;
		if(link.head != null && link.head.m_pNext == null)
			return;
		
		Stack<LinkNode> nodes = new Stack<LinkNode>();
		LinkNode p = link.head.m_pNext;
		while(p != null)
		{
			nodes.push(p);
			p = p.m_pNext;
		}//while
		
		while(!nodes.empty())
		{
			p = nodes.pop();
			System.out.print(p.m_nValue + "\t");
		}//while
	}
	
	/**
	 * 逆序输出我们链表
	 * @param pHead
	 */
	public static void PrintListReversingly_Recursively(LinkNode pHead)
	{
		if(pHead != null)
		{
			if(pHead.m_pNext != null)
			{
				PrintListReversingly_Recursively(pHead.m_pNext);
			}//if
			System.out.print(pHead.m_nValue + "\t");
		}//if
	}
	
	public static void main(String[] args)
	{
		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);
		
		PrintListReversingly_Iteratively(link);
		System.out.println();
		PrintListReversingly_Recursively(link.head);
	}
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值