汇总: 1.单链表的 增删改查
2.求有效节点的个数
3. 找到单链表倒数第k个节点
4. 单链表反转
5. 逆序打印单链表
// 定义一个 类管理链表
class SingleList{
// 初始化一个节点,作为头节点,头节点不要动
private static Node head = new Node(0,"");
public static Node getHead() {
return head;
}
// 添加数据的方法
public void add(Node node){
// 创建一个辅助节点,指向头节点开始
// 让他等于当前节点的next,如果当前节点的next为空
// 就加到后面
Node temp = head;
while(temp.next != null){
// 下一个节点不为空,就等于下一个节点,一直往后找
temp = temp.next;
}
// 跳出循环,说明temp.next = null 让它等于传进来的node
temp.next = node;
}
// 按编号顺序添加
public void addNum(Node node){
Node temp = head; // 找到头节点
if(temp.next == null){ // 判断是否为空,是空直接添加,否则后面使用temp.next 会发生异常
temp.next = node;
return;
}
while(true){
temp = temp.next; // 已经最少有一个数据了,temp后移
if(temp.next == null){ // 找到最后了,添加在最后
temp.next = node;
break;
}
Node help = null; //创建一个辅助变量
if(node.num < temp.next.num){ // 待添加的编号,小于temp后的编号
help = temp.next;
temp.next = node;
node.next = help;
break;
}
}
}
// 单链表的删除
public void delete(int num){ // 传入需要删除的编号
if(head.next == null){ //判断为空
System.out.println("链表为空");
return;
}
Node temp = head;
while(true){
if(temp.next.num == num){
if(temp.next.next == null){ // 删除的是最后一个节点
temp.next = null;
}else {
Node help = temp.next.next;
temp.next = help;
}
break;
}
if(temp.next == null){
System.out.println("没有找到该节点");
break;
}
temp = temp.next;
}
}
// 修改节点
public void revise(int num, String name){ // 传进来需要修改节点的编号,和需要修改的名字
// 先判断是否为空
if(head.next == null){
System.out.println("链表为空,无法修改");
}
Node temp = head.next;
// 循环遍历,找到要修改的节点
while(true){
if(temp == null){ //链表已经遍历完了,此时temp已经指向链表最后一个元素的后面了
System.out.println("没有找到该编号");
break;
}
if(temp.num == num){
temp.setName(name);
break;
}
temp = temp.next;
}
// Node temp = head;
// while(true){
// temp = temp.next;
// if(temp.num == num){
// temp.setName(name);
// break;
// }
// if(temp.next == null){
// System.out.println("没有找到该节点");
// break;
// }
// }
}
// 显示链表
public void show(){
// 先判断是否为空
if(head.next == null){
System.out.println("链表为空");
return;
}
// 不为空,则创建辅助节点,进行遍历
Node temp = head.next; //至少有一个数据了
while(temp != null){
System.out.println(temp);
// 输出后,temp后移
temp = temp.next;
}
}
// 练习题,求单链表中有效节点的个数 接收一个头节点
public static int listNodeNum(Node head){
if(head.next == null){
return 0;
}
int count = 1;
Node temp = head.next; // 最少有一个数据了
while(true){
if(temp.next == null){
return count;
}
temp = temp.next;
count ++;
}
}
// 练习题 找到单链表倒数第k个节点
/**
* 思路,编写一个方法,接收head节点,和一个 k
* 先把链表从头到尾遍历,得到有效节点数,可以调用上面 listNodeNum()方法
* 再从头遍历,辅助变量指向第一个有效节点,向后找 (总数-k)次,
* 比如有3个节点,找倒数第一个,就是从一开始向后走两步
*/
public Node getLastIndex(Node head,int k){
if(head.next == null){ // 链表为空
return null;
}
int num = listNodeNum(head); // 得到有效数据个数
// 进行数据的校验
if(k <= 0 || k > num){
return null;
}
Node temp = head.next;
for (int i = 0; i < num - k; i++) {
temp = temp.next;
}
return temp;
}
// 单链表的反转
/**
* 思路, 先创建一个新的头节点
* 对原链表进行遍历,每遍历一个节点,就把它放在新链表的最前端
* 最后,让原链表的head.next = 新链表的第一个节点
*/
public void reverseList(Node head){ //接收原链表的头节点
if(head.next == null || head.next.next == null){ //链表为空或者只有一个节点,不需要反转
return;
}
Node temp = head.next; // 用于遍历的辅助节点,从第一个有效节点开始
Node help = null; // 用于辅助遍历,保存指向的辅助节点,指向temp后
Node head2 = new Node(0,""); // 新节点的头
while(temp != null){
help =temp.next;
temp.next = head2.next;
head2.next = temp;
temp = help;
}
head.next = head2.next;
}
// 逆序打印单链表
/**
* 遍历节点放入栈中,利用栈的先入后出的特点打印
*/
public void reversePrint(){
if(head.next == null){ // 链表为空
return;
}
Stack<Node> nodes = new Stack<>();
Node temp = head.next;
while(temp != null){
nodes.push(temp); //将指向的节点放入栈中
temp = temp.next; // 后移
}
while (nodes.size() > 0){ // 当栈中有数据时,就出栈并打印
System.out.println(nodes.pop());
}
}
}
class Node{
public int num;
public String name;
public Node next;
public Node(int num, String name) {
this.num = num;
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"num=" + num +
", data='" + name + '\'' +
'}';
}
}
这篇博客详细介绍了单链表的各种操作,包括增删改查,如添加数据、按编号顺序添加、删除节点、修改节点信息。此外,还提供了求有效节点个数、找到倒数第k个节点、链表反转以及逆序打印链表的实现方法。这些内容涵盖了链表的基本操作和常见算法问题的解决方案。
1878

被折叠的 条评论
为什么被折叠?



