文章目录
一、单链表
前期准备:
1)创建一个学生结点
public class StudentNode {
public int id;
public int num;//学号
public String name;//姓名
public StudentNode next;//保存下一个结点
public StudentNode(int id, int num, String name) {
this.id = id;
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "StudentNode{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
}
2)创建一个单链表
public class SingleLinkedList {
private StudentNode head;
/**
* init a node of head
* 初始化一个头节点
*/
public SingleLinkedList( ) {
head = new StudentNode(0, 0, "");
}
public StudentNode getHead() {
return head;
}
"""""""""""
}
1、添加结点
思路:
1.通过遍历找到指向空的结点(temp.next=null)
2.修改指针的指向,也就是让temp.next=null指向新的结点
看图说话:
代码:
public void add(StudentNode studentNode) {
StudentNode temp = head;
//while循环用于找到最后一个结点(null)
while (true) {
if (temp.next == null) {
break;
} else {
temp = temp.next;//移动指针到下一个结点
}
}
//studentNode 为新添加的结点
temp.next = studentNode;
}
2、遍历链表
思路:
1、获得头结点
2、定义一个变量作为临时变量
3、循环移动指针,知道为null停止
看图说话:
代码:
public void list() {
if (head.next == null) {
System.out.println("LinkedList is empty!");
return;
}
StudentNode temp = head.next;
while (true) {
if (temp == null) {
break;
} else {
System.out.println(temp);
}
temp = temp.next;
}
}
3、修改结点
代码:
public void update(StudentNode studentNode) {
if (head.next == null) {
System.out.println("linkedList is empty!");
return;
}
StudentNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == studentNode.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.num = studentNode.num;
temp.name = studentNode.name;
} else {
System.out.println("Can't find :" + studentNode.id + " node!");
}
}
4、删除结点
思路:
1.找到要删除结点的前一个结点。
2.修改指针的指向,将要修改结点的前一个结点指针指向后一个结点。
看图说话:
代码:
public void remove(int id) {
StudentNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id == id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("Can't find the node for id!");
}
}
5、获取长度
思路:
将链表遍历一遍即可。
代码:
public int getLength(StudentNode head) {
if (head.next == null) {
return 0;
}
int length = 0;
StudentNode cur = head.next;
while (cur != null) {
length++;
cur = cur.next;
}
return length;
}
6、获取链表的倒数第N个结点
思路:
1.有多种方式:比如可以设置快慢指针可一遍就删除倒数第N个结点。
2.
看图说话:
代码:
public StudentNode getLastIndexNode(StudentNode head, int index) {
if (head.next == null) {
return null;
}
int size = getLength(head);
if (index <= 0 || index > size) {
return null;
}
StudentNode cur = head.next;
for (int i = 0; i < size - index; i++) {
cur = cur.next;
}
return cur;
}
7、反转链表
代码:
public void reverseList(StudentNode head) {
if (head.next == null || head.next.next == null) {
return;
}
StudentNode cur = head.next;
StudentNode next = null;
StudentNode reverseHead = new StudentNode(0, 0, "");
while (cur != null) {
next = cur.next;
cur.next = reverseHead.next;
reverseHead.next = cur;
cur = next;
}
head.next = reverseHead.next;
}
8、反转打印链表
代码:
public void reversePrint(StudentNode head) {
if (head.next == null) {
return;
}
Stack<StudentNode> stack = new Stack<StudentNode>();
StudentNode cur = head.next;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
9、按照编号有序添加结点
代码:
public void addByOrder(StudentNode studentNode) {
//get a head node
StudentNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id > studentNode.id) {
break;
} else if (temp.next.id == studentNode.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println(studentNode.id + " is existed and can't add again!");
} else {
studentNode.next = temp.next;
temp.next = studentNode;
}
}
10、在指定位置插入结点
二、双链表
双向链表介绍
前期准备:
1)创建一个学生结点
package com.qingfeng.linkedList.doubles;
class StudentNode {
public int id;//序号
public int num;//学号
public String name;//姓名
public StudentNode next;//保存下一个结点
public StudentNode pre;//保存前一个结点
public StudentNode(int id, int num, String name) {
this.id = id;
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "StudentNode{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
}
2)创建一个双向链表
public class DoubleLinkedList {
/**
* init a node of head
*/
private StudentNode head;
public DoubleLinkedList( ) {
head = new StudentNode(0, 0, "");
}
public StudentNode getHead() {
return head;
}
--------functions----------
}
1、添加结点
代码:
/**
* create node of LinkedList
*
* @param studentNode
*/
public void add(StudentNode studentNode) {
StudentNode temp = head;
while (true) {
if (temp.next == null) {
break;
} else {
temp = temp.next;
}
}
temp.next = studentNode;
/**
* 1) temp.next.pre=temp;
* 2) studentNode.pre=temp;
*/
studentNode.pre = temp;
}
2、修改结点
代码:
/**
* update a node
*
* @param studentNode a student object
*/
public void update(StudentNode studentNode) {
if (head.next == null) {
System.out.println("linkedList is empty!");
return;
}
StudentNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == studentNode.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.num = studentNode.num;
temp.name = studentNode.name;
} else {
System.out.println("Can't find :" + studentNode.id + " node!");
}
}
3、删除结点
代码:
/**
* remove a node by id
*
* @param id
*/
public void remove(int id) {
StudentNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.pre.next = temp.next;
if (temp.next != null) {
temp.next.pre = temp.pre;
}
} else {
System.out.println("Can't find the node for id!");
}
}
4、遍历结点
代码:
/**
* order the list
*/
public void list() {
if (head.next == null) {
System.out.println("LinkedList is empty!");
return;
}
StudentNode temp = head.next;
while (true) {
if (temp == null) {
break;
} else {
System.out.println(temp);
}
temp = temp.next;
}
}
完整代码
package com.qingfeng.linkedList.doubles;
public class DoubleLinkedList {
/**
* init a node of head
*/
private StudentNode head;
public DoubleLinkedList( ) {
head = new StudentNode(0, 0, "");
}
public StudentNode getHead() {
return head;
}
/**
* create node of LinkedList
*
* @param studentNode
*/
public void add(StudentNode studentNode) {
StudentNode temp = head;
while (true) {
if (temp.next == null) {
break;
} else {
temp = temp.next;
}
}
temp.next = studentNode;
/**
* 1) temp.next.pre=temp;
* 2) studentNode.pre=temp;
*/
studentNode.pre = temp;
}
/**
* update a node
*
* @param studentNode a student object
*/
public void update(StudentNode studentNode) {
if (head.next == null) {
System.out.println("linkedList is empty!");
return;
}
StudentNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == studentNode.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.num = studentNode.num;
temp.name = studentNode.name;
} else {
System.out.println("Can't find :" + studentNode.id + " node!");
}
}
/**
* remove a node by id
*
* @param id
*/
public void remove(int id) {
StudentNode temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.id == id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.pre.next = temp.next;
if (temp.next != null) {
temp.next.pre = temp.pre;
}
} else {
System.out.println("Can't find the node for id!");
}
}
/**
* order the list
*/
public void list() {
if (head.next == null) {
System.out.println("LinkedList is empty!");
return;
}
StudentNode temp = head.next;
while (true) {
if (temp == null) {
break;
} else {
System.out.println(temp);
}
temp = temp.next;
}
}
}
测试代码
代码:
package com.qingfeng.linkedList.doubles;
/**
* test
*/
@SuppressWarnings("all")
public class DoubleLinkedListDemo {
public static void main(String[] args) {
StudentNode node1 = new StudentNode(1, 2018010210, "liuxin");
StudentNode node2 = new StudentNode(2, 2018010211, "yanghai");
StudentNode node3 = new StudentNode(3, 2018010212, "huxiaotian");
DoubleLinkedList linkedList = new DoubleLinkedList();
linkedList.add(node1);
linkedList.add(node2);
linkedList.add(node3);
/*------------------------------------------------------------------------*/
System.out.println("-------testList-------");
linkedList.list();
/*------------------------------------------------------------------------*/
System.out.println("-------testAdd-------");
StudentNode node4 = new StudentNode(4, 2018010212, "guoyoudao");
linkedList.add(node4);
linkedList.list();
/*------------------------------------------------------------------------*/
System.out.println("-------testRemove----");
linkedList.remove(3);
linkedList.list();
/*------------------------------------------------------------------------*/
System.out.println("-------testUpdate-----");
StudentNode update = new StudentNode(4, 2018010212, "xiaoming");
linkedList.update(update);
linkedList.list();
}
}
运行结果:
-------testList-------
StudentNode{
num=2018010210, name='liuxin'}
StudentNode{
num=2018010211, name='yanghai'}
StudentNode{
num=2018010212, name='huxiaotian'}
-------testAdd-------
StudentNode{
num=2018010210, name='liuxin'}
StudentNode{
num=2018010211, name='yanghai'}
StudentNode{
num=2018010212, name='huxiaotian'}
StudentNode{
num=2018010212, name='guoyoudao'}
-------testRemove----
StudentNode{
num=2018010210, name='liuxin'}
StudentNode{
num=2018010211, name='yanghai'}
StudentNode{
num=2018010212, name='guoyoudao'}
-------testUpdate-----
StudentNode{
num=2018010210, name='liuxin'}
StudentNode{
num=2018010211, name='yanghai'}
StudentNode{
num=2018010212, name='xiaoming'}
Process finished with exit code 0