单链表的面试算法题[更新中...]
1. 新浪面试:请设计一个单链表,给定头结点和整数k,返回单链表倒数第k个结点。

代码[Java实现]:
/**
* 返回单链表倒数第k个结点: [新浪面试题 & 剑指Offer.22]
* 思路:1. 接收头结点和k值
* 2. 整体遍历,得到链表长度
* 3. 再次遍历,返回(len-k)个值即为倒数第k个结点
* @author KyleHsu
*/
public Node lastKNode(Node head,int k){
// 没有结点,没有找到
if (head.next == null){
return null;
}
int len = SinglelinkedlistTest.getLen(head);
// 如果给的k不在链表长度范围内,肯定找不到
if (k<=0 || k>len){
return null;
}
Node temp = head.next;
for (int i = 0; i < (len-k); i++) {
temp = temp.next;
}
return temp;
}
/**
* 返回单链表的有效节点个数
* @author KyleHsu
*/
public static int getLen(Node head){
if (head.next == null){
return 0;
}
int length = 0;
Node temp = head.next;
while (temp != null){
temp = temp.next;
length++;
}
return length;
}
2. 腾讯面试:请设计一个单链表,给定头结点,将其反转。

/**
* 反转一个单链表: [腾讯面试题 & 剑指Offer.24]:
* 思路1:头插法:实际上只是用了一个辅助temp指针和一个新的头结点把原来的单链表进行了反转,并没有制造新的链表
* 思路2:使用栈的特性 - 后进先出
* 思路3:递归反转
*/
public static void reverseLinkedlist(Node head){
// 考虑意外情况
if (head.next == null){
throw new RuntimeException("当前链表为空,无需进行反转~~");
}
if (head.next.next == null){
throw new RuntimeException("当前链表仅有一个结点,无需进项反转~~");
}
/**
* 使用头插法进行反转:
* 1.创建一个新的头结点,用于临时连接新的结点
* 2.创建一个辅助结点,用于指向原链表的第一个结点,逐个去除原链表的结点,然后连接到新链表头结点的第一个
*
* next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
* cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
* reverseHead.next = cur; //将cur 连接到新的链表上
* cur = next;//让cur后移
*/
Node newHead = new Node(0,"","");
Node temp = head.next;
Node tempNext = null;
// 只要原链表中还有结点就一直往后找
while (temp != null){
tempNext = temp.next; // 先保存第一个结点的后一根线
temp.next = newHead.next; //抛弃第一个结点的前一根线
newHead.next = temp; //再接上第一个结点的前一根线
temp = tempNext; // 接上第一个结点的后一根线
}
// 接上头结点
head.next = newHead.next;
}
3. 百度面试:请设计一个单链表,给定头结点,将其逆序打印。

/**
* 逆序打印单链表:[百度面试题]:
* 方式一:利用刚才反转的单链表,然后直接遍历即可。但是由于反转了原来的单链表会破坏掉链表的结构,所以不推荐!
* 方式二:利用栈的特点 - 后进先出
*
* 其实本题思路和腾讯面试题相同,只是换了栈的方式实现而已
*
*/
public static void reversePrint(Node head){
// 考虑意外情况
if (head.next == null){
throw new RuntimeException("当前链表为空,无需进行反转~~");
}
Stack<Node> nodes = new Stack<>();
Node temp = head.next;
while (temp != null){
// 压栈
nodes.push(temp);
temp = temp.next;
}
while (nodes.size() > 0){
System.out.println(nodes.pop());
}
}

浙公网安备 33010602011771号