1.单链表的概念
单链表由数据元素和所对于的索引构成,并且有头节点,并且头节点 的数据为空。
首先建立单链表:
要明白但链表的属性,即成员变量,成员变量private Node head; private int N;需要有头节点记录开始,和长度,即数组的长度。
private Node head; //头节点
private int N//长度
//成员变量
链表要添加新节点数据就必须要有建立新节点的方法和相关的类
private class Node {
T data ;//T表示泛型,就是T可以代表所以类型的数据类型
Node next;//一个新节点必须有标明下一个节点是什么
public Node(T data, Node next) {
this.data = data; //依次传入
this.next = next;
}
}
```//成员方法包括:对链表的初始化链表,查询链表是否为空,获取链表的长度,清空全部链表,获得某一位置上的值,
//向链表中加入元素,向链表指定位置加入值,移除某个位置上的元素,输出一个值查询链表中是否存在该值。
//第一对单链表的初始化:
```java
public void Link(){
this.head=new Node(null,null)//先给头节点创建,内容为null,下一个元素也为null;
this.N=0;//开始元素为零
}
//查看链表是否为空`
public boolean isempty() {
return N==0;
}
``//查看链表长度
```java
public int length(){
return N;//返回N的长度即可
}
//清空全部链表
public void clear(){
this.head.next=null;//头节点下一个节点为空即可
this.N=0;
}
//获得某一位置上的值
public T get(int t){
Node n=head.next;//现将头节点指向第一个元素
for(int index =0;n.index<i;index++)//依次循环到该输入的索引号位置
{
n=n.next;
}
return n.data;//将n的值返回
}//有一个for循环时间复杂度为O(n);根据表的长度变换
//向链表中加入元素
//单链表的添加是直接添加在链表的尾部
public void inser(T t){
Node n=head;
whlie(n.next!=null){//依次遍历到该数组的最后一位;//有一个for循环时间复杂度为O(n);根据表的长度变换
n=n.next;//通过迭代循环变到尾部;
}
Node newNode=new Node( t,null);//创建新节点,将t的值加入,因为加到尾部所以next=null;
n.next=newNode;//将之前的最后一个元素指向添加后的最后一个元素;
N++//整个数组长度+1;
}
//向指定位置添加元素
public void inser(int i T t){
Node n=head;
for(int index=0;index<i-1;i++){//有一个for循环时间复杂度为O(n);根据表的长度变换
n=n.next;//将指针移动到最i的前一个元素,因为是index<i-1;
}
Node curr=n.next;//找出i位置上原来的值curr;
Node newNode=new Node(t,curr);//新建一个节点,将t传入其中,将curr作为新节点的下一个值使用;
n.next=newNode;将原来节点的下一个指向新节点,跳过原来的节点,完成
newNode.next=curr;//新插入的节点的下一个节点指向原来的节点;
N++;//元素增加+1;
//移除某个位置上的元素
public T remove(int i){
Node n=head;
for( int index=0;index<i-1;index++)//有一个for循环时间复杂度为O(n);根据表的长度变换
{
n=n.next;//将指针移动到最i的前一个元素,因为是index<i-1;
}
Node curr=n.next;//找出i位置上原来的值curr;
Node nextNode=curr.next;//删除的节点的下一个节点;
n.next=nextNode;//将要删除的节点的上一个节点指向要删除节点的下一个节点;
N--;
}
//输出一个值查询链表中是否存在该值,如果有返回该值的索引号
public int indexof(int i){
Node n=head;
while(n.next!=null){//将单链表内元素依次循环至尾部//有一个for循环时间复杂度为O(n);根据表的长度变换
n=n.next;
if(n.data.equals(t)){//判断遍历到的元素是否和输入的值相等;
return i;
}
}
return -1;
}
小结
在单链表的学习中,主要有头节点,且head.next=null;
在删除和向固定位置添加时,其原理是目标位置的前一个节点的next改变,和将目标节点的next改变,具体看是删除的话,将上一个节点指向目标节点的下一个节点,添加,直接指向添加节点,依次改变。最好使用whlie来循环到目标节点,这样并容易出现错误,还有要主要,head和head.next的使用。