import java.util.Stack;
//顺序链表
public class LinkListDemo {
public static void main(String[] args) {
Man man1 =new Man(1,“张三”,“12”);
Man man2 =new Man(2,“李四”,“15”);
Man man3 =new Man(3,“基尼太美”,“21”);
Man man4 =new Man(4,“无敌”,“34”);
SingleLinkList s =new SingleLinkList();
s.add(man1);
s.add(man3);
s.add(man4);
s.add(man2);
Man man5 =new Man(4,“遗迹”,“52”);
Man man6 =new Man(5,“mmm”,“52”);
s.updite(man5);
s.updite(man6);
s.del(2);
s.del(5);
s.show();
System.out.println();
//测试链表中的有效数据个数
System.out.println("有效节点个数="+getLength(s.getHead()));
System.out.println();
//测试是否得到倒数第k个节点
Man k =findLastIndex(s.getHead(),1);
System.out.println("倒数第一个节点是:"+k);
System.out.println();
//测试单链表的反转 方式二,使用栈,链表结构没有改变
System.out.println("使用栈实现链表的反转:");
reversePrint(s.getHead());
System.out.println();
//测试单链表的反转 方式一,链表本身结构改变了
System.out.println("使用链表实现反转:");
reversetList(s.getHead());
s.show();
System.out.println();
}
//求链表中的数据总个数,不考虑头节点
public static int getLength(Man head){
if (head.next==null){
return 0;
}
int length =0;
Man c =head.next;
while (c !=null){
length++;
c =c.next;
}
return length;
}
//查找单链表中的倒数第index个节点(新浪面试题)
//1,编写一个方法,接受head节点,同时接收一个index节点
//2。index表示是到处第index个节点
//3.先把链表从头到尾遍历,得到总节点个数(不考虑头节点)
//得到length后,遍历length-index个,就可以得到了
//如果找到,返回该节点,没有返回null
public static Man findLastIndex(Man head,int index){
if (head.next ==null){
return null;
}
int length =getLength(head);
if (index <= 0 || index > length){
return null;
}
Man c = head.next;
for (int i=0;i<length-index;i++){//这里画个图理解比较简单
c =c.next;
}
return c;
}
//求单链表的反转(腾讯面试题)
//方式一
//创建一个新的链表,把原来的链表遍历,将遍历出来的数据加入到新的链表中,实现反转
public static void reversetList(Man head){
//如果链表为空或者只有一个节点,直接返回
if (head.next == null || head.next.next==null){
return ;
}
//定义一个辅助指针,帮助我们遍历原来的链表
Man cur =head.next;
Man next =null; //指向当前节点cur的下一个节点;
Man reverse =new Man(0,"",""); //创建一个新的头节点
//遍历原来的链表,每遍历一个节点,就放入新的链表的最前端
//画图理解好一点
while (cur!=null){
next =cur.next; //暂时保存当前节点的下一个节点
cur.next =reverse.next;//将cur的下一个节点放到新的头节点的最前端
reverse.next=cur; //将cur连接到新的链表上
cur=next;//让cur后移
}
head.next=reverse.next;//将head。next指向reverse.next。实现链表的反转
}
//方式二
//使用栈来实现链表的反转
public static void reversePrint(Man head){
if (head.next ==null){
return;
}
Stack<Man> stack =new Stack<Man>();
Man cur =head.next;
while (cur !=null){
stack.push(cur);
cur =cur.next;
}
while (stack.size()>0){
System.out.println(stack.pop());
}
}
}
class Man{//定义一个man
int no;//每个man的编号
String name;
String age;
Man next;
public Man(int no, String name, String age) {
this.no = no;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Man{" +
"no=" + no +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
class SingleLinkList{//创建一个链表
private Man head = new Man(0,"","");
public Man getHead() {
return head;
}
public void add(Man man){
Man temp =head;//设置一个虚拟指针代替头指针
while (true){
if (temp.next ==null){
break;
}
//如果虚拟指针的下一个man的编号大于添加的man的编号,那么就把man插入到其中
if (temp.next.no>man.no){
man.next=temp.next;
temp.next=man;
break;
}
if (temp.next.no == man.no){
System.out.println(“添加的目标已存在,不能重复添加”);
break;
}
temp =temp.next;
}
temp.next =man;
}
public void updite(Man newMan){//修改
Man temp =head;
boolean flag =false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.no == newMan.no){
flag =true;
break;
}
temp =temp.next;
}
if (flag){
temp.next.name =newMan.name;
temp.next.age=newMan.age;
}else {
System.out.println("你修改的id不存在");
}
}
public void del(int no){//删除
Man temp =head;
boolean flag =false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.no == no){
flag =true;
break;
}
temp =temp.next;
}
if (flag){
temp.next =temp.next.next;
}else {
System.out.println("你删除的id不存在或者链表已空");
}
}
public void show(){//显示链表
Man temp =head.next;
if (temp == null){
System.out.println("链表为空");
}
while (true){
System.out.println(temp);
temp =temp.next;
if (temp == null){
break;
}
}
}
}