質問インデックス(最大5):⭐⭐⭐⭐⭐
タイトル
単一リンクリストを逆にします。
例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
上級:
リストは反復的または再帰的に反転できます。この問題を2つの方法で解決できますか?
解決策
3つのポインターを使用した反復:頭、前、現在を簡単に達成できます
JavaScriptの実装
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
// 算法实现
function ListNode(val) {
this.val = val;
this.next = null;
}
var reverseList = function (head) {
// 特殊情况
if (head === null || head.next === null) return head;
// 从第二个节点开始迭代反转
// 注意这几句的顺序不能颠倒
let previous = head;
head = head.next;
let current = head;
previous.next = null;
do {
head = head.next;
current.next = previous;
previous = current;
current = head;
} while (head !== null)
return previous;
};
// 测试数据
// 1->2->3->4->5->null
let h = new ListNode(1);
let n2 = new ListNode(2);
let n3 = new ListNode(3);
let n4 = new ListNode(4);
let n5 = new ListNode(5);
h.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
function showLink(head) {
let temp = head;
while (temp != null) {
console.log(temp.val);
temp = temp.next;
}
}
showLink(h);
let h2 = reverseList(h);
showLink(h2);
体験
友人がマイクロソフトにいたときにこの質問に遭遇しましたが、この質問の頻度は非常に高いです。トピック自体は難しくありません。注意してください。
データ構造の教師がこの問題について話しているとき、私たちは2つのポインターのみを使用する必要があり、それは大きなラウンドでした。これは次元の削減でした。=-=、3つのポインターを使用してストレージスペースを犠牲にし、脳細胞を節約するのはよくありません。