单向链表及java代码实现

链表是一种常见的数据结构,其在物理存储单元上非连续、非顺序,由一系列的结点组成,而结点在运行时可以动态生成。每个结点包含两个部分:1.数据域,用来存储数据元素;2.指针域,用来指向该结点的下一个结点。而单向链表是链表的一种,链接方向是单向的,要想访问单向链表的某个结点必须从头部开始顺序遍历,链表的头部也叫做头结点,相当于一个数据域为空,指针域指向链表中第一个结点的结点。同时,由于最后一个结点没有后续结点,所以最后一个结点的指针域为空。
在这里插入图片描述
对于单向链表而言,常见的有链表顺序遍历添加结点、在指定位置处添加结点、获取某个结点的数据域的元素以及删除指定位置处结点的操作。
1.顺序遍历添加结点
从链表的头结点处开始顺序遍历, 在当前链表的末尾结点插入新结点,修改末尾结点的指针域,使其指向添加的新结点。
2.在指定位置处添加结点
从链表的头结点处开始顺序遍历,直到获取指定位置处的前一个结点,使得前一个结点的指针域指向添加的新结点,而添加的新结点的指针域指向原链表中前一个结点的后续结点。
3.获取某个结点的数据域的元素
需要从链表的头结点开始顺序遍历,直到遍历到指定位置。
4.删除指定位置处结点
从链表的头结点处开始顺序遍历,直到获取指定位置处的前一个结点,修改该结点的指针域,使其指向所要删除结点的位置处的下一个结点。
在这里插入图片描述
在这里插入图片描述

以下是java代码实现(部分代码参照了这篇博客java实现单链表(最清晰))

public class Solution<V> {
	public Node head=new Node(null);
	public int size=0;
	public Solution() {
		
	}
	/*
	 * 获取相应位置结点处的元素
	 */
	public V get(int i) {
		if(i<0||i>size-1)
			throw new ArrayIndexOutOfBoundsException("获取的位置不合法!");
		else {
			Node temp=head;
			int count=-1;
			while(temp!=null) {
				if(count==i) {
					return (V)temp.data;
				}
				temp=temp.next;
				count++;
			}
		}
		return null;
	}
	/*
	 * 链表末尾添加结点
	 */
	public void add(V data) {
		Node temp=head;
		while(temp.next!=null) {
			temp=temp.next;
		}
		temp.next=new Node(data);
		size++;
	}
	/*
	 * 指定位置处插入结点
	 */
	public void add(V data,int i) {
		if(i<0||i>size)
			throw new ArrayIndexOutOfBoundsException("插入的位置不合法");
		else {
			Node temp=head;
			int count=-1;
			while(temp!=null) {
				if((i-1)==count) {
					Node node=new Node(data);
					Node back=temp.next;
					temp.next=node;
					node.next=back;
					size++;
				}
				temp=temp.next;
				count++;
			}
		}
	}
	/*
	 * 删除指定位置处的结点
	 */
	public void delete(int i) {
		if(i<0||i>size-1)
			throw  new ArrayIndexOutOfBoundsException("删除的位置不合法!");
		else {
			Node temp=head;
			int count=-1;
			while(temp!=null) {
				if((i-1)==count) {
					temp.next=temp.next.next;
					size--;
				}
				temp=temp.next;
				count++;
			}
		}
	}
	public String toString() {
		StringBuilder sb=new StringBuilder();
		Node temp=head;
		sb.append("head->");
		temp=temp.next;
		while(temp!=null) {
			if(temp.next!=null) {
				sb.append(temp.data+"->");
			}
			else
				sb.append(temp.data);
			temp=temp.next;
		}
		return sb.toString();
	}
	public static void main(String[] args) {
		Solution<Integer> s=new Solution<>();
		s.add(1);
		s.add(2);
		s.add(5, 2);
		s.add(3);
		s.add(6);
		//s.delete(3);
		//System.out.println(s.get(3));
		System.out.println(s);
	}
}
class Node<V>{
	V data;
	Node next=null;
	Node(V data){
		this.data=data;
	}
}

运行结果如下:
head->1->2->5->3->6

发布了82 篇原创文章 · 获赞 34 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38883271/article/details/104211918
今日推荐