4.3单链表的面试题
package com.atguigu03.linkedList;
import java.util.Stack;
public class SingleLinkedListDemo {
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addByOrder(heroNode1);
singleLinkedList.addByOrder(heroNode4);
singleLinkedList.addByOrder(heroNode2);
singleLinkedList.addByOrder(heroNode3);
singleLinkedList.addByOrder(heroNode3);
HeroNode newHeroNode = new HeroNode(3, "有用", "没脑袋");
singleLinkedList.update(newHeroNode);
singleLinkedList.delete(4);
singleLinkedList.showList();
System.out.println("链表的有效节点个数为:" + getLength(singleLinkedList.getHead()));
System.out.println("原来的链表顺序为:");
singleLinkedList.showList();
reverswList(singleLinkedList.getHead());
System.out.println("反转后链表的顺序为:");
singleLinkedList.showList();
System.out.println("原来链表的顺序为:");
singleLinkedList.showList();
System.out.println("逆序打印单链表:");
reversePrint(singleLinkedList.getHead());
}
public static int getLength(HeroNode head) {
int count = 0;
HeroNode temp = head;
while (true) {
if (temp.next == null) {
return count;
}
count++;
temp = temp.next;
}
}
public static HeroNode findLastIndexNode(HeroNode head,int index) {
if (head.next == null) {
return null;
}
int size = getLength(head);
if (index <= 0 || index > size) {
return null;
}
int length = 0;
HeroNode temp = head.next;
while (length != (size - index)) {
length ++;
temp = temp.next;
}
return temp;
}
public static void reverswList(HeroNode head) {
if (head.next == null || head.next.next == null) {
return;
}
HeroNode cur = head.next;
HeroNode next = null;
HeroNode reverseHead = new HeroNode(0,"","");
while (cur != null) {
next = cur.next;
cur.next = reverseHead.next;
reverseHead.next = cur;
cur = next;
}
head.next = reverseHead.next;
}
public static void reversePrint(HeroNode head) {
if (head.next == null || head.next.next == null) {
return;
}
Stack<HeroNode> stack = new Stack<>();
HeroNode cur = head.next;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
}
class SingleLinkedList {
private HeroNode head = new HeroNode(0, "", "");
public void add(HeroNode heroNode) {
HeroNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = heroNode;
}
public void addByOrder(HeroNode heroNode) {
HeroNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
else if (temp.next.no > heroNode.no) {
break;
}else if (temp.next.no == heroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("当前链表之中已经存在相同序号的元素" + heroNode.no + ",不能进行插入操作");
}else {
heroNode.next = temp.next;
temp.next = heroNode;
}
}
public void update(HeroNode newHeroNode) {
if (head.next == null) {
System.out.println("当前链表为空!");
return;
}
HeroNode temp = head;
while(true) {
if (temp.next == null) {
System.out.println("没有找到对应序号的英雄");
break;
}
if (temp.next.no == newHeroNode.no) {
temp.next.name = newHeroNode.name;
temp.next.nickName = newHeroNode.nickName;
break;
}
temp = temp.next;
}
}
public void delete(int no) {
if (head.next == null) {
System.out.println("当前链表为空!");
return;
}
HeroNode temp = head;
while (true) {
if (temp.next == null) {
System.out.println("没有找到要删除的节点,请确认后输入");
return;
}
if (temp.next.no == no) {
if (temp.next.next == null) {
temp.next = null;
break;
}
System.out.println("找到要删除的节点,正在删除~~~");
HeroNode deleteNode = temp.next;
temp.next = deleteNode.next;
deleteNode.next = null;
break;
}
temp = temp.next;
}
}
public HeroNode getHead() {
return head;
}
public void showList() {
if (head.next == null) {
System.out.println("当前链表为空!");
return;
}
HeroNode temp = head.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
class HeroNode {
public int no;
public String name;
public String nickName;
public HeroNode next;
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "heroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}