1. 链表的基本概念及创建
链表基本概念:
1.在一条链表中,元素和元素之间有相对顺序,链表也是有头有尾的
2.与之前学过的顺序表不同的点在于链表在逻辑上有序,但是不保证在物理(存储)过程中满足逻辑上的次序
3.链表中的结点类(Node):可以把结点看做一个盒子,盒子里装有结点的值,还有指向下一个节点的线索(next)
public class Node {
public int val;//保存结点的值
public Node next;//保存指向下一个结点的引用
}
4.在一条链表中,头结点是最重要的,找到头结点就可以找到链表中的其他元素,所以一般用头结点来代表一条完整的链表
Node head = ...;//头结点的定义
Node head = null;
头结点为null,表示该结点不存在,也就是说这是一条空链表
指定头结点的代码:
Node head = n1;//让head的引用指向n1引用指向的对象
在上图中:
cur:指的是当前结点,也就是说表示的是链表中的某个结点
pre:指的是前驱结点,表示链表中某个结点的前一个结点(头结点没有前驱结点)
next:指的是后继结点,表示链表中某个结点的前一个结点(尾结点没有后继结点)
链表的创建:
代码:
//创建了一个顺序为[1,3,2,6]的链表
Node n1 = new Node();
Node n3 = new Node();
Node n2 = new Node();
Node n6 = new Node();
n1.val = 1;
n3.val = 3;
n2.val = 2;
n6.val = 6;
n1.next = n3;//用到后继结点,可以形成一个完整的链表
n3.next = n2;
n2.next = n6;
n6.next = null;//尾结点的后继结点一般为null
Node head = n1;//确定头结点 head和n1指向同一个对象
2. 链表的遍历
实现链表的遍历只需要打印链表中的每一个元素
代码实现遍历链表[1, 3,2, 6]并打印链表的每个元素:
Node cur = head;//让cur(当前结点)指向head指向的对象
while ( cur != null){
System.out.println(cur.val);//输出目前cur的值
cur = cur.next;//让cur指向cur.next目前指向的对象
}
图示如下:
3.链表遍历练习
1.通过遍历找到链表的最后一个结点:
//方法一:
Node cur = head;//让cur2指向head指向的对象
while(cur != null && cur.next != null){
cur = cur.next;
}
//如果cur.next为null的话,就是最后一个结点
System.out.println(cur.val);//6
//方法二:(暂时不考虑链表为空的情况)
Node last = head;//让last指向head指向的对象
while(last.next != null){//遍历
last = last.next;
}
//last.next为null的话直接跳出循环,打印尾结点的值
System.out.println(last.val);//6
2.通过遍历,计算链表中元素的个数:
int count = 0;//定义一个count,记录遍历次数
Node cur1 = head;//让cur(当前结点)指向head指向的对象
while ( cur1 != null){
System.out.println(cur1.val);//输出目前cur的值
cur1 = cur1.next;//让cur指向cur.next目前指向的对象
count++;//每遍历一次,都让count++
}
System.out.println("链表中元素个数:" + count);//4
3.通过遍历,找到链表的倒数第二个结点:
要点:定义一个secondLast而后进行遍历,
如果secondLast.next.next == null就证明secondLast是我们要找的倒数第二个结点
Node secondLast = head;//让secondLast指向head指向的对象
while (secondLast.next.next != null){
//当secondLast.next.next为空时,就代表找到了倒数第二个结点
secondLast = secondLast.next;
}
System.out.println(secondLast.val);//2
4.通过遍历,找到链表的第n个结点(链表长度>=n)
int n = 2; //表示要找的是第二个结点
Node nCur = head;
for (int i = 1; i < n; i++) {//每循环一次就向后走一步
nCur = nCur.next;//一共需要走n-1步
}
System.out.println(nCur.val);//3
5.通过遍历,找到链表中是否包含某个元素:
boolean isFound = false;//定义一个判断函数
int target = 3; //要找的元素
cur = head;
while(cur != null){
if(cur.val == target){
//在遍历中判断现在遍历到的元素是否是要找的元素target
isFound = true;
}
cur = cur.next;
}
System.out.println(isFound);//true