25. K 個一組翻轉鏈表-詳解棧實現

題目

給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。

k 是一個正整數,它的值小於或等於鏈表的長度。

如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

示例

給你這個鏈表:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

說明

你的算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

通過次數56,434
提交次數95,949

來源:力扣(LeetCode)
鏈接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group.

思路:
此題多種解法,這裏採用棧的思想進行講解。
那麼。什麼是棧呢?
棧的最典型特點就是後進先出
用下圖來描述會更好理解:

在這裏插入圖片描述
從圖中可以清晰的看出,先入棧的元素被壓入棧底,只有當棧頂元素都出棧後它才能出棧!

此題要將鏈表的k個節點進行反轉,可以採用入棧出棧的方式,先·入棧的最後出棧,從而達到反轉鏈表的目的!

java實現:

  /**
     * 使用棧實現
     * @param head
     * @param k
     * @return
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        //定義一個棧
        Stack<ListNode> stack=new Stack<ListNode>();
        //初始化一個新的鏈表存放結果
        ListNode ret = new ListNode(0);
        //爲新鏈表定義一個指針,防止後續操作改變鏈表頭節點
        ListNode p = ret;
        //循環原有鏈表
        while (true){
            //爲每次反轉計數
            int count=0;
            //定義指針操作原始鏈表
            ListNode tmp = head;
            //循環入棧
            while (tmp!=null&&count<k){
                stack.push(tmp);
                tmp=tmp.next;
                count++;
            }
            //判斷該次反轉是否達到要求,此處防止因tem==null跳出循環的條件
            if (count!=k){
                //表示剩下的節點不夠k個,直接將剩餘節點插入末尾結束
                p.next=head;
                break;
            }
            //出棧操作,反轉鏈表
            while (!stack.isEmpty()){
                p.next=stack.pop();
                p = p.next;
            }
            //重置下一次操作的初始節點
            p.next=tmp;
            head=tmp;
        }
        return ret.next;
    }
小結

此題爲力扣題目中的困難題。這是其中的一種解法。另外還可以通過尾插法,遞歸實現。不過我認爲用棧來解題比較好理解。不過建議小夥伴們還是要去了解一下尾插法解題,這也是鏈表中的一種經典算法!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章