单向链表
概念懂得都懂,不懂的是上面的人为了保护你,让你少知道点东西比较好,毕竟这东西你说它重要也确实重要,说他不重要也确实没那么重要,但是我觉得挺重要的.复制粘贴太损耗社会劳动力了,
通过节点类Node的next引用下一个节点的一种数据结构,
记录复习一下实现方法
package DataStrct.linklist;
/**
* @author luke
* @date 2021/4/1812:43
*/
public class SinglelinklistDemo {
public static void main(String[] args) {
SingleLinklist singleLinklist = new SingleLinklist(new Node(1, "第一个节点"));
singleLinklist.add(new Node(2, "第二个节点"));
singleLinklist.add(new Node(3, "第三个节点"));
singleLinklist.add(new Node(4, "第四个节点"));
singleLinklist.print_list();
}
static class Node {
int node_id;
String node_data;
Node next_node;
public Node(int node_id, String node_data) {
this.node_id = node_id;
this.node_data = node_data;
}
@Override
public String toString() {
return "node{" +
"node_id=" + node_id +
", node_data='" + node_data +
'}';
}
}
static class SingleLinklist {
Node head;
SingleLinklist(Node node) {
head = node;
}
public void add(Node node) {
//添加节点,直接添加到链表的最后
//1.找到链表的最后一个节点--node.next = null
Node tempnode = head;
while (true) {
//定义一个tempnode 变量用来存放当前遍历的节点
if (tempnode.next_node == null) {
break; //next为null 说明是最后一个节点,跳出遍历循环
} else if (tempnode.next_node != null) {
tempnode = tempnode.next_node;//如果下个节点不为空,则将下个节点赋予临时遍历继续遍历
}
}
tempnode.next_node = node;
}
public void print_list() {
//遍历打印链表
Node temp = head;
while (true) {
//打印当前的节点
System.out.println(temp);
if (temp.next_node == null) {
break;
}
//将临时节点赋值为下个节点
temp = temp.next_node;
}
}
}
}
还有带排序的单项链表
package DataStrct.linklist;
/**
* @author luke
* @date 2021/4/1817:26
*/
public class SingleOrderlinklistDemo {
public static void main(String[] args) {
SingleOrderlinklist singleOrder = new SingleOrderlinklist(new Node(6, "第六个节点"));
singleOrder.add(new Node(2, "第二个节点"));
singleOrder.add(new Node(4, "第四个节点"));
singleOrder.add(new Node(5, "第五个节点"));
singleOrder.add(new Node(3, "第三个节点"));
singleOrder.print_list();
//修改
singleOrder.update(new Node(5,"修改后的第五个节点" ));
singleOrder.print_list();
}
static class Node {
int id;
String data;
Node next;
public Node(int id, String data) {
this.id = id;
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", data='" + data + '\'' +
'}';
}
}
static class SingleOrderlinklist {
Node head;
public SingleOrderlinklist(Node head) {
this.head = head;
}
public void add(Node node) {
//按照顺序插入
//1.通过比较插入节点id 直至遇到当前节点的下个节点的id比当前插入的id大时,插入到当前id的下个节点中
Node tempnode = head;
//先和头节点比较,如果小于头节点直接插入到头节点
if (node.id<tempnode.id){
node.next=tempnode;
head=node;
return;
}
while (true) {
if (tempnode.next == null) {//当当前的节点下个为空时,需要比较插入节点和当前的节点的大小
break;
}
if (node.id < tempnode.next.id) {//因为是插入,所以要把当前节点的下个节点接入到插入节点的下个节点
break;
}
tempnode = tempnode.next;
}
node.next=tempnode.next;
tempnode.next=node;
}
public void update(Node node){
//遍历链表找到对应的节点,并更新里面的属性
Node temp = head;
while (true){
if (temp==null){
break;
}
if (temp.id==node.id){
temp.data=node.data;
break;
}
temp=temp.next;
}
}
//打印
public void print_list() {
Node tempnode = head;
while (true) {
System.out.println(tempnode);
if (tempnode.next == null) {
break;
}
tempnode = tempnode.next;
}
}
}
}