直接上干货。。。。。
链表常见题型:
- 找到单链表的倒数第k个节点。
- 删除单链表中的某个结点(O(1))。
- 反转链表。
- 两个链表的第一个公共结点。
- 有环链表返回环路的开头节点(及判断是否有环)。
- 合并两个排序的链表。
- 删除链表中重复的结点。
先给出链表的定义:
/**
* 单链表定义
*/
public static class Node<E>{
private E element;//节点保存的元素
private Node<E> next;//指向下一个节点的引用
public Node(){}
public Node(E element){
this.element = element;
}
public Node(E element,Node<E> next){
this.element = element;
this.next = next;
}
public E getElement(){
return element;
}
public Node<E> getNext(){
return next;
}
public void setElement(E element){
this.element = element;
}
public void setNext(Node<E> next){
this.next = next;
}
}
关于鲁棒性:
鲁棒性也称为健壮性,是指程序能够判断输入是否合乎规范要求,并对不合要求的输入予以合理的处理。容错性是鲁棒性的一个重要体现。提高代码鲁棒性的有效途径是进行防御性编程,防御性编程是一种编程习惯,是指预见在什么地方可能会出现问题,并为这些可能出现问题制定处理方式。在面试时,最常用也是最有效的防御性编程是在函数入口添加代码以验证用户输入是否符合要求。
1. 找到单链表的倒数第k个节点。
这里假设最后一个节点为倒数第一个。思想:快慢指针。实现代码如下:
public static Node<Integer> solution(Node<Integer> head,int k){
// 判断k是否非法
if(k < 1){
return null;}
// 判断是否为空
if(head == null) return null;
// 快指针
Node<Integer> nAhead = head;
// 慢指针
Node<Integer> nBehind = head;
// 快指针先走k-1步
for(int i = 0;i<k-1;i++){
// 判断是否存在倒数第k个节点
if(nAhead.getNext() != null)
nAhead = nAhead.getNext();
else
return null;
}