在上一篇文章的基础上进行加入代码:链表 Linked List (单链表)
1 :求单链表当中有效节点的个数
public static int getLength(Node headnode) {
if (headnode.next == null) {
return 0;
}
int length = 0;
Node temp = headnode.next;
while (temp != null) {
length++;
temp = temp.next;
}
return length;
}
并且加上一个获取头节点的方法
public Node getHead() {
return headnode;
}
测试效果图如下:
2.查询倒数第n个节点。
首先获取一个头节点,以及一个index。index表示倒数第几个节点
随后从头开始遍历,求得总长度length,使用length-index就可以得到是顺数第几个节点。
public static Node findNode(Node head,int index) {
//链表为空
if (head==null) {
System.out.println("链表为空");
return null;
}
int length = getLength(head);
//遍历到length-index 位置,即倒数第n个节点
if (index<=0||index>length) {
System.out.println("输入的index不合法");
return null;
} else {
Node temp = head.next;
//使用for循环进行定位
for (int i = 0; i < length-index; i++) {
temp =temp.next;
}
return temp;
}
}
}
测试代码:求倒数第二个节点
3.单链表的反转
- 先定义-一个节点reversalHead =new Node();
- 从头到尾遍历原来的链表,每遍历-一个节点,就将其取出,并放在新的链表reversalHead的最前端.
- 原来的链表的head.next =reversalHead.next
代码如下:
public static void reversal(Node head) {
// 链表为空或者只有一个节点的时候不需要反转
if (head.next == null || head.next.next == null) {
return;
}
// 辅助变量
Node temp = head.next;
Node next = null;
Node reversalHead = new Node(0, "", "");
// 遍历原来的链表
while (temp != null) {
next = temp.next;// 暂时保存当前节点的下一个节点
temp.next = reversalHead.next;
reversalHead.next = temp; //将反转后的头节点连接到现在遍历的这个节点
temp = next;
}
// 将head.next指向reversalHead.next
head.next = reversalHead.next;
}
测试代码如下:
4:把单链表从尾到头打印
方式一:使用上述代码先将链表反转,遍历链表即可。但是会改变单链表的结构。
方式二:利用栈的先进后出的特点,将链表压到栈当中。
使用栈的方式:
// 链表的反向打印
public static void reversalnode(Node head) {
if (head.next == null) {
return;
}
Stack<Node> stack = new Stack<Node>();
Node temp = head.next;
//将链表节点压入栈中
while(temp != null) {
stack.add(temp);
temp =temp.next;
}
//节点遍历打印
while(stack.size()>0) {
System.out.println(stack.pop());
}
}
测试代码:
System.out.println("逆序打印单链表:");
reversalnode(SingleLinkedList.getHead());