单向链表的简单Java实现(内含逆序)

        最近面试的过程中,发现有的公司的面试题考到了链表的逆序,这一块我正好不是特别清楚。于是打算把链表这一块好好的学习学习。在网上搜寻了众多的资料以后,了解到链表的核心是节点与节点之间的互相链接。

        于是自己也写了一个单向链表的类,里面包括input插入方法,inputById按指定下标插入方法,deleteAll删除所有节点方法,deleteById按指定下标删除结点方法,showAll控制台查看所有元素方法,reverse反转当前链表方法,length获取当前链表长度方法,等基本方法。

        需要说明的是,这个类还有很多不足之处,它还有很多需要改进的地方。但是基本原理和单向链表是相同的,仅供参考。

package demo_4;

import java.util.Stack;

public class MyList<Re_Helix> {
	//节点内部类;
	private class Node{
		private Re_Helix data;			//数据;
		private Node next = null;			//下个节点的引用;
		
		public Node() { 		//节点的无参构造;
			super();
		}
		
		public Node(Re_Helix data) { 		//节点的有参构造;
			super();
			this.data = data;
		}
	}
	
	private Node head;			//头部节点;
	private Node end;			//尾部节点;
	private Node point;			//临时节点;
	private int length;			//长度属性;
	
	public MyList() {			//链表的无参构造;
		head = new Node();
		end = head;
		length = 0;
	}
	
	public void input(Re_Helix data) {			//给链表插入新值;
		point = new Node(data);
		if(length==0) {
			end.data = point.data;
		}else {
			end.next = point;
			end = point;
		}
		length++;
	}
	
	public void inputById(int target,Re_Helix data) {			//在制定下标的位置插入新值,如果两端超出范围,则分别按照head和end处理;
		Node temp = new Node(data);
		if(target>=length) {
			end.next = temp;
			end = temp;
		}else if(target<=0) {
			temp.next = head;
			head = temp;
		}else {
			temp.next = packPoint(target);
			packPoint(target-1).next = temp;
		}
		length++;
	}
	
	public int length() {			//返回链表的长度;
		return length;
	}
	
	public Re_Helix getById(int target) {			//输入下标返回值;
		return packPoint(target).data;
	}
	
	public void showAll() {			//在控制台查看当前链表中的所有数据
		point = head;
		int i = 0;
		while(point!=null) {
			System.out.println("第"+(i++)+"个:"+point.data);
			point = point.next;
		}
	}
	
	public void reverse() {			//将链表反转;
		Stack<Node> s1 = new Stack<Node>();			//利用队列的先进先出的特性;
		point = head;
		while(point!=null) {
			s1.push(point);
			point = point.next;
		}
		head = s1.pop();
		point = head;
		while(!s1.isEmpty()) {
			point.next = s1.pop();
			point = point.next;
		}
		end = point;
		end.next = null;  //要将逆序后的end位置节点的next置空,不然会造成最后两位的循环;
	}
	
	public void deleteById(int target) {			//输入下标删除值
		if(target>0) {
			packPoint(target-1).next = packPoint(target).next;
		}else {
			head = head.next;
		}
		length--;
	}
	
	public void deleteAll() {			//清空链表;
		length = 0;
		head.data = null;
		head.next = null;
		point = null;
		end = head; 
		System.gc();
	}
	
	public boolean editById(int target,Re_Helix data) {			//修改传入下标位置的值;
		if(target<0 || target>length) {
			return false;
		}else {
			packPoint(target).data = data;
			return true;
		}
	}
	
	private Node packPoint(int target) {			//内部方法,将指针指向指定下标的节点;
		if(target<=0) {
			point = head;
		}else if(target>=length) {
			point = end;
		}else {
			int i = 0;
			point = head;
			while(i++!=target) {
				point = point.next;
			}
		}
		return point;
	}
}

多有不足,欢迎批评指正;

转载请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值