代码中用到的单链表及节点类来自:https://blog.csdn.net/u011727603/article/details/102684823
1、统计有效节点个数 不包含头节点
public static int count(SingleLinkNodeList linkNodeList) {
LinkNode header = linkNodeList.getHeader();
int count = 0;
LinkNode temp = header.next;
while (temp!=null) {
count++;
temp = temp.next;
}
return count;
}
2、获得倒数第N个节点
public static LinkNode get(SingleLinkNodeList linkList, int n) {
LinkNode header = linkList.getHeader();
if (header.next == null) {
throw new RuntimeException("链表为空");
}
//获得总个数
int count = count(linkList);
if (n <= 0 || n > count) {
throw new RuntimeException("非法数字");
}
//计算出倒数第n个是正数第index个
int index = count - n;
//遍历 找到第index个节点并返回
int num = 0;
LinkNode temp = header;
while (num <= index) {
temp = temp.next;
num++;
}
return temp;
}
3、单链表翻转
public static void reverse(SingleLinkNodeList list) {
LinkNode header = list.getHeader();
if (header.next == null) {
throw new RuntimeException("链表为空");
}
//只有一个节点 不需要翻转
if(header.next.next==null){
return;
}
//cur标识遍历中的当前节点 初始化指向header后面的第一个节点
LinkNode cur = header.next;
//next标识cur后面的一个节点 这个指针是为了在cur加入翻转链表后 还能继续遍历原链表
LinkNode next = null;
//定义一个临时头节点 后面链接翻转序列 最后用原链表的头部替换它 完成翻转
LinkNode reverseHeader = new LinkNode(0, "临时头节点");
//遍历原链表
while (cur!=null) {
//next赋值
next = cur.next;
//下面两行完成把原链表的每一个节点都插入到临时头节点后面的操作
cur.next = reverseHeader.next;
reverseHeader.next = cur;
//next记录了cur后面的位置 这里是cur后移
cur = next;
}
//最后替换头部
header.next = reverseHeader.next;
}
仅做学习过程中记录用,每一个操作并不是唯一的或最好的做法。