链表是一种常见的数据结构,其在物理存储单元上非连续、非顺序,由一系列的结点组成,而结点在运行时可以动态生成。每个结点包含两个部分: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