“`”

经历了很多面试,面试官最爱考察的算法无非是斐波那契数列和单链表反转,尽管是这些都是基础知识,然而我对单链表反转有更多的想法。
递归法是我早期最爱在面试中使用的算法,很有逼格,写起来非常优雅,非常好理解。

先定义链表数据结构

<pre><code class=""language-java"" lang=""java"">static class Node {
Integer data;
Node next;
}

static Node readyNode() {
Node linkNode1 = new Node();
linkNode1.data = 1;
Node linkNode2 = new Node();
linkNode2.data = 2;
Node linkNode3 = new Node();
linkNode3.data = 3;
Node linkNode4 = new Node();
linkNode4.data = 4;
Node linkNode5 = new Node();
linkNode5.data = 5;
Node linkNode6 = new Node();
linkNode6.data = 6;
linkNode1.next = linkNode2;
linkNode2.next = linkNode3;
linkNode3.next = linkNode4;
linkNode4.next = linkNode5;
linkNode5.next = linkNode6;
return linkNode1;
}
</code></pre>

如上代码所示

<img referrerpolicy=""no-referrer"" src=""http://res.mianshigee.com/upload/article/20200429/ef17daa5-ad76-4f25-9ba7-3cb37bc595be.png"">

递归法会逐层确定该节点有没有next节点,若为空,则认定递归到最深层元素。同时将该层节点的next指向父节点,在递归栈中以此类推。

<pre><code class=""language-java"" lang=""java"">static Node reverseLinkedList(Node node) {
if (node == null || node.next == null) {
return node;
} else {
Node headNode = reverseLinkedList(node.next);
node.next.next = node;
node.next = null;
return headNode;
}
}
</code></pre>

<img referrerpolicy=""no-referrer"" src=""http://res.mianshigee.com/upload/article/20200429/45f24971-8fad-4f13-96b5-ddb7a2f95a4c.png"">

上图展示了递归后的效果。
如果注释掉第7行,会发生如上图所示的1、2号节点闭环问题。由于1号节点的next没有置空,依旧指向2号节点,所以遍历时候肯定存在环。

 

<pre><code> "“`

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.