根据no编号值进行排序,将节点添加到指定的位置
// 根据no编号值进行排序,将节点添加到指定的位置
public void addHeroSort(HeroNode heroNode) {
HeroNode temp = head;
boolean flag = false;
while (true) {
if(temp.next == null){
break;
}
if(temp.next.no > heroNode.no){
break;
}
if(temp.next.no == heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
System.out.println("该编号已存在!");
}else {
heroNode.next = temp.next;
temp.next = heroNode;
}
}
拓展:当传入的值为头结点时,对此链表进行遍历,将代码添加到上面的方法中,可以实现链表的排序
获取倒数第K个位置上的节点
/**
* 分析:倒数第K个节点就是正数第size - K + 1个节点,这里size表示这个链表的长度
*/
public HeroNode getHeroNode(HeroNode head, int k){
if(head.next == null){
return null;
}
int size = getLength(head);
if(k <= 0 || k > size){
return null;
}
HeroNode temp = head.next;// 表示第一个节点
for (int i = 1; i < size - k + 1; i++) {
temp = temp.next;
}
return temp;
}
链表反转
1、创建一个反转后链表的头结点,遍历原有链表,将原有链表的每一个值都添加在新链表头结点的后面实现反转
public void reverseNode4(HeroNode head) {
if (head.next == null || head.next.next == null) {
return;
}
HeroNode cur = head.next;
HeroNode next;
HeroNode reserveNodeHead = new HeroNode();
while (cur != null) {
next = cur.next;
cur.next = head.next;
reserveNodeHead.next = cur;
cur = next;
}
head.next = reserveNodeHead.next;
}
同上一样的方式,不创建新的节点,直接在原链表的头结点上进行插入,反转
public void reverseNode3(HeroNode head) {
if (head.next == null || head.next.next == null) {
return;
}
HeroNode cur = head.next;
HeroNode next;
head.next = null;
while (cur != null) {
next = cur.next;
cur.next = head.next;
head.next = cur;
cur = next;
}
}
方式二:不创建头结点,遍历原始链表的每一个节点,从后向前建立新的链表
public void reverseNode2(HeroNode head) {
if (head.next == null || head.next.next == null) {
return;
}
HeroNode cur = head.next;
HeroNode next;
HeroNode first = null;
while (cur != null) {
next = cur.next;
cur.next = first;
first = cur;
cur = next;
}
head.next = first;
}
方式三:循环遍历多次,每次获取原始链表的最后一个节点,把这个节点添加到新的链表中,并删除原链表的最后一个节点,再次遍历,直到原链表为空
public HeroNode reverseNode(HeroNode head){
if(head.next == null){
throw new RuntimeException("列表为空!");
}
SingleLinkedList list = new SingleLinkedList();;
while (head.next.next != null) {
HeroNode temp = head.next;// 遍历用到的临时节点,这里从第一个节点开始
while (temp.next.next != null) {
temp = temp.next;
}
list.addHero(temp.next);
temp.next = null;
}
list.addHero(head.next);
return list.getHead();
}