元のタイトル:
最初にコードを貼り付けます。
public class Solution92 {
public ListNode reverseBetween(ListNode head, int left, int right) {
//创建一个虚拟头节点以处理需要反转的节点是头节点的情况
ListNode newhead = new ListNode(-1);
newhead.next = head;
//创建cur节点使其指向left节点的前一个节点
ListNode cur = newhead;
for (int i = 0; i < left-1; i++) {
cur = cur.next;
}
//创建ret节点指向cur节点的next节点,即left节点
ListNode ret = cur.next;
//开始遍历链表,将left节点的后继节点移到cur节点之后
for (int i = 0; i < right-left; i++) {
ListNode retNext = ret.next;
ListNode curNext = cur.next;
cur.next = retNext;
ret.next = retNext.next;
retNext.next = curNext;
}
//返回虚拟头节点的后继节点
return newhead.next;
}
}
思考分析:
タイトルは、リンクリストの左の位置と右の位置の間のリンクリストを逆にする必要があることを示しています。たとえば、左が2に設定され、右が4に設定されている場合、その意味は次の図:
まず、この問題が発生した場合、最初に頭に浮かぶ反転方法は、左ノード(以下、左ノード)を位置とする先行ノードを右ノード(以下、以下)に向けることです。次に、左側のノードを右側のノード(以下、右側のノードと呼びます)の位置にポイントします。右側のノードの後続ノードをポイントし、このリンクリスト内の各ノードのポイントを次のように変更します。前のノード。ただし、この方法は複雑すぎて冗長であるため、左側のノードと右側のノードを見つけてトラバースし、リンクリスト内の各ノードのポイントを変更する必要があります。
日常生活の中でキュージャンプという現象に遭遇したに違いありません。誰もが前にジャンプしたいので、1人が1回列にジャンプし、1人が1回列にジャンプし、前の人がゆっくりと押し込まれます。裏側、この問題の解決策は似ています。
左のノードが最後のノードになるまで、左の位置の後の各ノードをチームの前に挿入します(ここでの最後のノードは、リンクリスト全体の最後のノードではなく、反転する必要があるリンクリストの最後のノードを指します。1つ;同じことがチームのフロントにも当てはまります。これは、リンクリストの前面を参照します。これは、リンクリストを元に戻す操作を完了するために、リンクリストを1回トラバースするだけで済みます。 。具体的な操作は次のとおりです。
ここでは、ヘッドノードも逆にする必要がある状況に対処するために、仮想ヘッドノードを導入して問題解決を容易にします。
次に、左側のノードの先行ノードを指すようにcurノードを作成します。
次に、リンクリストのトラバースを開始します。
最後に、新しく作成された仮想ヘッドノードの次のノードを返します。