先赞后看,养成习惯!

反转链表解题技巧(一文让你在也不怕面试官提问如何)(1)

最近写了几篇有关“链表”的文章,其中有理论知识的,也有一些是写如何自己手动实现链表结构的。其实在实际开发中,很少会自己去实现链表。写这些文章的目的也是为了加深对链表这种数据结构的理解。

今天呢咱们就搞点实际的,聊一聊“面试”中会问到的有关链表的问题。为了这篇文章我请教了几位最近刚刚跳槽的小伙伴,其中出现频率最高的一道面试题是:“单向链表的反转!”那么今天就来聊一聊如何反转单向链表。

反转链表解题技巧(一文让你在也不怕面试官提问如何)(2)

什么是反转单向链表

其实所谓的反转单向链表,就是将一个原本顺序是“A->B->C->D”的单向链表变成“D->C->B->A”。这种操作就是反转单向链表。

实现思路

总体思路就是创建一个新的链表,每次从待反转的单向链表上摘下来一个节点,放到新链表的头节点后面。

反转链表解题技巧(一文让你在也不怕面试官提问如何)(3)

代码实现

/**

* 反转单链表

*

* @param head 链表的头节点

*/

public void reversetSingleLinkedList(Node head) {

// 判断该链表是否为空,或者只有一个节点

if(head.next == null || head.next.next == null){

return;

}

// 定义辅助变量,遍历链表使用。

Node cur = head.next;

// 用于保存辅助节点(cur)的下一个节点。

Node next = null;

// 创建头节点(为反转链表使用)

Node reverseHead = new Node("reverseHead");

// 遍历待反转的链表

while (cur != null){

// 保存辅助节点(cur)的下一个节点

next = cur.next;

// 将辅助节点的指针域(指向下一个节点)指向reverseHead的下一个节点。

cur.next = reverseHead.next;

// 将reverseHead的指针域(指向下一个节点)指向cur

reverseHead.next = cur;

// 将辅助变量后移

cur = next;

}

// 将待反转链表头节点中指向下一个节点的指针域,指向反转链表头节点的下一个节点

head.next = reverseHead.next;

}

代码讲解

第一步:

cur.next = reverseHead.next;

reverseHead.next = cur;

第一行代码含义是,当每次循环时将用于遍历的辅助变量(cur)的指针域,指向新创建的反转链表头节点(reverseHead)的下一个节点。从而实现从待反转的链表上获取一个节点,并将这个节点放到反转链表头节点(reverseHead)的下一个节点前面。结合第二行代码(reverseHead.next = cur),就会实现每次从待反转的链表上获取一个节点,然后放到反转链表的头节点(reverseHead)后面。

第二步:

head.next = reverseHead.next;

当循环结束后reverseHead的结构就是反转后的链表。替换reverseHead头节点,将待反转链表中头节点的指针域,指向reverseHead.next(反转链表中头节点的下一个节点),从而实现单链表的反转。

结语

通过上面的方式可以轻松实现单链表的反转,是不是再也不怕面试官提问了?如果有哪些地方不是特别明白或者文章写的有问题,大家可以在评论区提出来。

今天的分享就先到这里了,看都看完了,点个赞再走吧!

反转链表解题技巧(一文让你在也不怕面试官提问如何)(4)

,