单链表

单链表结构:


链表的应用场景

1、对线性表的长度或者规模难以估计;
2、频繁做插入删除操作;
3、构建动态性比较强的线性表。

链表的代码实现:

节点类

package linkDemo;

public class Node {
	protected Node next; //指针域  
    protected int data;//数据域  
      
    public Node( int data) {  
          this. data = data;  
    }  
      
    //显示此节点  
    public void display() {  
         System. out.print( data + " ");  
    } 
}
package linkDemo;

/**
 * 单链表类
 * @author cnwl
 *
 */
public class LinkList {
	public Node first;   //定义一个头结点
	private int pos = 0; //结点的位置
	
	public LinkList(){
		this.first = null;
	}
	
	//插入一个头结点
	public void addFirstNode(int data){
		Node node = new Node(data);
		node.next = first;
		first = node;
	}
	
	//删除一个头结点,并返回头结点
	public Node deletefirstNode(){
		Node tempNode = first;
		first = tempNode.next;
		return tempNode;
	}
	
	//在任意位置插入节点,在index的后面插入
	public void add(int index,int data){
		Node node = new Node(data);
		Node current = first;
		Node previous = first;
		while (pos != index){
			previous = current;
			current = current.next;
			pos++;
		}
		
		node.next = current;
		previous.next = node;
		pos=0;
	}
	
	//删除任意位置的节点
	public Node deleteByPos(int index){
		Node current = first;
		Node previous = first;
		while(pos != index){
			pos ++;
			previous = current;
			current = current.next;
		}
		if(current == first){
			first = first.next;
		}else {
			pos = 0;
			previous.next = current.next;
		}
		
		return current;
	}
	
	//根据节点的data删除节点(仅仅删除第一个)
	public Node deleteByData(int data){
		Node current = first;
		Node previous = first; //记住上一个节点
		while(current.data != data){
			if(current.next == null){
				return null; 
			}
			previous = current;
			current = current.next;
		}
		if(current == first){
			first = first.next;
		}else {
			pos = 0;
			previous.next = current.next;
		}
		
		return current;
	}
	
	//显示出所有的节点信息
	public void displayAllNodes(){
		Node current = first;
		while (current !=null){
			current.display();
			current = current.next;
		}
		System.out.println();
	}
	
	//根据位置查找节点信息
	public Node findByPos(int index){
		Node current = first;
		if(pos != index){
			current = current.next;
			pos++;
		}
		return current;
	}
	
	//根据数据查找节点信息
	public Node findByData(int data){
		Node current = first;
		while(current.data != data){
			if(current.next == null ){
				return null ;
			}
		}
		return current;
	}
	
}
测试类:
package linkDemo;

public class TestLinkList {
	public static void main(String[] args){
		LinkList linkList = new LinkList();
		linkList.addFirstNode(20);
		linkList.addFirstNode(21);
		linkList.addFirstNode(19);
		//19,21,20
		linkList.add(1,22);  //19,22,21,20
		linkList.add(2,24);  //19,22,24,21,20
		linkList.add(3,51);  //19,22,24,51,21,20
		linkList.displayAllNodes();
		
		Node node = linkList.deleteByData(19);  
//      Node node = linkList.deleteByPos(0);  
        System. out.println( "node : " + node. data);  
        linkList.displayAllNodes();  
        Node node1 = linkList.findByPos(0);  
        System. out.println( "node1: " + node1. data);  
        Node node2 = linkList.findByData(22);  
        System. out.println( "node2: " + node2. data);  
	}
	
}

结果:



评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值