判斷單鏈表迴文的三種方法
Everyone thinks of changing the world, but no one thinks of changing himself.
上海自來水來自海上,中山諸羅茶羅諸山中。非常有意境的句子,正著讀倒著讀都是一個意思。非常對陳,強迫症患者福音。本文分享了基於單鏈表判斷迴文的三種方法。所有原始碼均已上傳至github: 連結
基於陣列
用陣列儲存連結串列前半段的值,使用快慢指標法來進行擷取。
但是這種陣列的倒序插入比較費時。
小技巧 :一直使用node.add(0,slow.data)相當於倒序插入
private boolean isPalindromeByArray(Node node) { if (null == node || null == node.next) return true; List<Integer> nodeList = new ArrayList<>(); Node fast = node; Node slow = node; nodeList.add(0, slow.data); while (null != fast.next && null != fast.next.next) { fast = fast.next.next; slow = slow.next; nodeList.add(0, slow.data); } Node curNode = slow; if (null != fast.next) { curNode = slow.next; } int index = 0; while (null != curNode) { if (curNode.data != nodeList.get(index)) { return false; } curNode = curNode.next; ++index; } return true; }複製程式碼
基於棧
和陣列的思想是一樣的,只不過儲存方式換成了棧,然後不斷地出棧和連結串列後半段比較即可。這種方式比較高效。
private boolean isPalindromeByStack(Node node) { if (null == node || null == node.next) return true; Stack<Integer> stack = new Stack<>(); Node fast = node; Node slow = node; stack.push(slow.data); while (null != fast.next && null != fast.next.next) { fast = fast.next.next; slow = slow.next; stack.push(slow.data); } if (null != fast.next) { slow = slow.next; } Node curNode = slow; while (null != curNode) { if (curNode.data != stack.pop()) { return false; } curNode = curNode.next; } return true; }複製程式碼
原地連結串列法
不借助外部儲存來實現判斷迴文,這裡用到了連結串列反轉的思想。先使用快慢指標法找到連結串列的後半部分,然後將其反轉再進行比較
private boolean isPalindromeAuto(Node node) { if (null == node || null == node.next) return true; Node fast = node; Node slow = node; while (null != fast.next && null != fast.next.next) { fast = fast.next.next; slow = slow.next; } Node preNode = slow; Node firstNode = slow.next; Node curNode = slow.next.next; firstNode.next = null; while (null != curNode) { Node nextNode = curNode.next; curNode.next = preNode.next; preNode.next = curNode; curNode = nextNode; } slow = node; fast = preNode.next; while (null != fast) { if (fast.data != slow.data) { return false; } slow = slow.next; fast = fast.next; } return true; }複製程式碼
測試結果
end
您的點贊和關注是對我最大的支援,謝謝!