上代码和注解
/*三大板块
1.定义节点
2.定义单链表操作
1.创建单链表
2.遍历单链表
3.修改单链表节点的值
4.删除单链表节点
5.将添加的节点按顺序排列
3.实际应用
1.求单链表中有效节点的个数
2.查找单链表中的倒数第k个节点【新浪面试题】
3.单链表的反转【腾讯面试题】
思路:
1.先定义一个节点reverseHead=new heroNode();
2.从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表的最前端
这一步可以看作是插入操作,分成两步
1.让被反转的节点指向reverseHead.next,即被反转的第一个节点
cur.next = reverseHead.next;
2.让reverseHead.next指向被反转的节点,即被反转的节点成为新的被反转的第一个节点
reverseHead.next = cur;
3.原来的链表head.next = reverseHead.next;
4.从头到尾打印单链表【百度面试题】
思路:
1.上面的题的要求就是逆序打印单链表
2.方式1:先将单链表进行反转操作,然后再遍历即可,这样做的问题是会破坏原来的单链表的结构,不建议
3.方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果
5.合并两个有序的单链表,合并之后的链表依然有序*/
package com.atguitu.linkedlist;
import java.util.Stack;
public class SingleLinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
StudentNode node1 = new StudentNode(1, "小松", 98);
StudentNode node2 = new StudentNode(2, "大松", 99);
StudentNode node3 = new StudentNode(3, "神松", 100);
SingleLinkedList singleLinkedList = new SingleLinkedList();
//按照顺序添加
// System.out.println("原始数据~~");
// singleLinkedList.add(node1);
// singleLinkedList.add(node2);
// singleLinkedList.add(node3);
// singleLinkedList.show();
//打乱添加,通过排序调整
System.out.println("排序添加~~");
singleLinkedList.addByOrder(node3);
singleLinkedList.addByOrder(node1);
singleLinkedList.addByOrder(node2);
singleLinkedList.show();
// 输出修改后的值
StudentNode node4 = new StudentNode(3, "瓜皮", 80);
System.out.println("修改后数据~~");
singleLinkedList.update(node4);
singleLinkedList.show();
// 输出删除后的值
System.out.println("删除后数据~~");
singleLinkedList.delete(3);
singleLinkedList.show();
//输出有效节点的个个数
//因为main是static方法,所以调用的方法也必须是static静态的
System.out.println("单链表有效节点的个数="+getLength(singleLinkedList.getHead()));
//输出单链表倒数第k个节点
System.out.printf("单链表倒数第k个节点是:"+findNode(singleLinkedList, 1));
//输出反转链表
// System.out.println();
// reverseList(singleLinkedList.getHead());
// singleLinkedList.show();
//输出从尾到头的单链表
System.out.println();
System.out.println("逆序打印的单链表:");
reversePrint(singleLinkedList.getHead());
//输出合并列表
Stude