1.求单链表中有效节点的个数
- 从头结点从头到尾遍历计数即可
2.查找单链表的倒数第k个节点(新浪面试题)
- 先从头遍历得到链表总的节点个数size
- 从头节点开始遍历(size-k)次得到该节点
- 如果没有返回null
3.单链表的反转(腾讯面试题)
- 定义一个新的头结点newHead,从头节点head遍历链表,每遍历一个节点删除并保存这个节点,然后将此节点插入到newHead的后面。
public void reverse() {
// 如果链表没有节点或只有一个节点,不需要反转
if (head.getNext() == null || head.getNext().getNext() == null) {
return;
}
Node newHead = new Node();
Node temp = head.getNext();
// 遍历链表
while (temp != null) {
// 删除temp节点
head.setNext(temp.getNext());
// 将temp节点插入到newHead后面
temp.setNext(newHead.getNext());
newHead.setNext(temp);
// 重置temp
temp = head.getNext();
}
// 重置head节点
head.setNext(newHead.getNext());
}
4.从尾到头打印单链表
- 方式一:先将单链表反转,再打印,打印结果就是一个逆序打印结果,但是不推荐使用,因为它会改变原链表的结构
- 方式二:将链表的节点从头到尾放到栈中,使用栈先进后出的特点来打印链表
5.合并两个有序单链表A、B,合并之后链表依然有序(从小到大)
1.和反转链表差不多,先定义一个先的头结点newHead
2.分别从链表链表A和链表B找到他们最大的节点,将这两个节点删除并保存到maxA、maxB
3.比较maxA和maxB的大小,如果maxA>maxB,将maxA先插入newHead后面,在将maxB插入newHead后面
4.重复2、3步直到将所有节点合并