一、统计有效节点个数 size
//返回链表有效节点的长度
public int getLength() {
int count = 0;
if (head.hasNext()) {
count++;
temp = head.getNext();
while (temp.hasNext()) {
count++;
temp = temp.getNext();
}
}
return count;
}
二、倒序查找
倒序 即 链表大小 - 正序。 倒数第 k 个就是 正数第 ( size - k ) 个
//返回倒数第 k 个节点
public MyNode<T> getNodeByLastK(int k) {
if (!head.hasNext()) {
System.out.println("链表空");
}
int length = 0;
if (k <= (length = getLength())) {
temp = head.getNext();
for (int i = 0; i < length - k; i++) {
temp = temp.getNext();
}
return temp;
}
return null;
}
二、链表翻转
辅助节点 tNext 存储 temp 后的数据链;辅助节点 reHead 作为翻转后的头节点暂时存储、拼接数据链。
//翻转链表
public void reverse() {
MyNode<T> reHead = new MyNode<>(null, 0, ""); //翻转后的头结点
MyNode<T> tNext; //用于临时存储 temp 后面的链
if (!head.hasNext() || !head.getNext().hasNext()) { //只有一个元素不用操作
return;
}
temp = head.getNext();
while (temp.hasNext()) {
tNext = temp.getNext();
temp.setNext(reHead.getNext());
reHead.setNext(temp);
temp = tNext;
}
head = reHead;
}
四、借助栈 Stack 倒序打印
//逆序打印
public void reversePrint() {
Stack stack = new Stack();
if (!head.hasNext()) {
System.out.println("链表空");
return;
}
temp = head.getNext();
//遍历压栈
while (temp != null) {
MyNode<T> tMyNode = new MyNode<T>(temp.getData(),temp.getNo(), temp.getName());
stack.push(tMyNode);
temp = temp.getNext();
}
//遍历弹栈
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
五、合并其他链表
//合并两个链表
public void add(MyLinkedList<T> list) {
MyNode<T> e;
while ((e = list.popFirst()) != null) {
addByOrder(e.getData(), e.getNo(), e.getName());
}
}
//弹出第一个元素
public MyNode<T> popFirst() {
if (!head.hasNext())
return null;
MyNode<T> p = head.getNext();
head.setNext(head.getNext().getNext());
p.setNext(null);
return p;
}