日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

用JAVA實現單鏈表,檢測字符串是否是回文串

瀏覽:26日期:2022-08-20 14:24:31

一.需求

使用JAVA實現單鏈表,使用單鏈表檢測字符串是否是回文串

二.需求分析

回文串最重要的就是對稱,那么最重要的問題就是找到那個中心,用快指針每步走兩格,當他到達鏈表末端的時候,慢指針剛好到達中心,慢指針在遍歷過程中(快指針到達末端時)把走過的節點進行反向操作,此時從中位點分為前后兩部分,此時前半部分的指針開始往回指(取next的時候,取的是前一個節點),而慢指針繼續向前,跟前半部分的數據依次進行比對,當慢指針掃完整個鏈表,就可以判斷這是回文串,否則就提前退出,同時在前半部分往回遍歷的過程中將前半部分的指針重置成正向。

鏈表存在奇偶數情況。

奇數的時候,快指針遍歷到末端的時候,中點位即中間位置的點,此中位點下一個節點為后半部分比對開始的位置。偶數的時候,快指針遍歷到末端的時候,中點位置此時為下中位點,此中位點就是后半部分比對開始的位置。

三.代碼實現

1.單鏈表類封裝

public class ListNode<T> { /** * 根節點索引位置 */ private int foot; /** * 代表鏈表程度 */ private int count; /** * 標識根節點 */ private Node root; //鏈接點類,內部方法實現,外部使用 private class Node { //數據信息 private T data; //下一個節點引用 private Node next; public Node(T data) { this.data = data; } //添加節點 private void add(T data) { if (this.next == null) { //如果當前節點的next為null,直接創建一個新的節點 this.next = new Node(data); } else { //否則進行遞歸調用,直到最后在某個為空的節點創建一個新節點 this.next.add(data); } } //刪除節點1 public void remove(Node previous, int index) { if (ListNode.this.foot++ == index) { //this表示當前要刪除的節點 previous.next = this.next; this.next = null; ListNode.this.count--; return; } else { //遞歸刪除 this.next.remove(this, index); } } //刪除節點2 public void remove(Node previous, T data) { if (this.data.equals(data)) { previous.next = this.next; this.next = null; ListNode.this.count--; return; } else { if (this.next != null) { this.next.remove(this, data); } else { return; } } } //修改數據 -- 新數據替換舊數據 public void replace(T oldData, T newData) { if (this.data.equals(newData)) { this.data = newData; } else { //遞歸修改,尋找當前節點下一個節點,直到某個節點的值匹配入參 this.next.replace(oldData, newData); } } //修改數據 -- 利用索引修改 public void replace(int index, T newData) { if (ListNode.this.foot++ == index) { //找到了某個值的索引和傳入的索引相同,直接替換 this.data = newData; } else { this.next.replace(index, newData); } } //查詢 public T get(int index) { if (ListNode.this.foot++ == index) { return this.data; } else { return this.next.get(index); } } //鏈表是否包含某個節點 public boolean contains(T data) { //如果當前的這個data正好和傳入的data匹配 if (this.data.equals(data)) { return true; } else { //如果當前的這個不匹配,則需要查找下一個節點 if (this.next == null) { return false; } else { return this.next.contains(data); } } } } public ListNode() { } //檢查鏈表是否為空 public boolean isEmpty() { if (count == 0 || this.root == null) { return true; } else { return false; } } //獲取鏈表的長度 public int size() { return this.count; } //添加 public void add(T data) { if (this.isEmpty()) { //如果鏈表為空,新建一個節點 this.root = new Node(data); } else { this.root.add(data); } this.count++; } //刪除 -- 按照索引刪除 public void remove(int index) { if (this.isEmpty()) { return; } if (index < 0 || this.count <= index) { return; } if (index == 0) { //想要刪除根節點 Node temp = this.root; this.root = this.root.next; temp.next = null; this.count--; return; } else { this.foot = 0; this.root.remove(this.root, index); } } //根據傳入的數值刪除 public void remove(T data) { if (this.isEmpty()) { return; } //如果刪除的正好是根節點 if (this.root.data.equals(data)) { Node temp = this.root; this.root = this.root.next; temp.next = null; this.count--; return; } else { this.root.remove(this.root, data); } } //修改 -- 根據索引修改 public void replace(int index, T newData) { if (this.isEmpty()) { return; } if (index < 0 || this.count <= index) { return; } this.foot = 0; this.root.replace(index, newData); } //修改 -- 新老數據替換 public void replace(T oldData, T newData) { if (this.isEmpty()) { return; } this.root.replace(oldData, newData); } //查詢 --- 根據索引查找 public T get(int index) { if (this.isEmpty()) { return null; } this.foot = 0; return this.root.get(index); } //是否包含 public boolean contains(T data) { if (this.isEmpty()) { return false; } return this.root.contains(data); } //打印 toArray public Object[] toArray() { if (this.isEmpty()) { return null; } int count = this.count; Object[] retVal = new Object[count]; for (int i = 0; i < count; i++) { retVal[i] = this.get(i); } return retVal; }}

2.驗證的具體方法

boolean isPalindrome(ListNode.Node head) { if (head == null || head.next == null) { return true; } // ListNode.Node prev = null; //慢指針節點 ListNode.Node slow = head; //快指針節點 ListNode.Node fast = head; //奇數的中位節點或者是偶數的下中位節點 ListNode.Node middle = head; while (fast != null && fast.next != null) { //快指針每次移動2個節點 fast = fast.next.next; //慢指針每次移動1個節點 ListNode.Node next = slow.next; //前半部分的指針反向。反向后前半部分節點的next節點都是他的前一個節點 slow.next = prev; //當前的慢指針指向前一個節點 prev = slow; //下一個節點變為慢節點 slow = next; //記錄中位節點 middle = slow; } //如果fast不是null,說明此時有奇數個節點,偶數個節點時fast為null //還沒有進行if處理之前slow節點和prev節點在奇偶數的情況下分別為 // a b c d c b a 此種情況下slow節點是d,prev節點是第1個c // a b c c b a 此種情況下slow節點是第2個c,prev節點是第1個c if (fast != null) { //slow取中間節點的下一個節點,做為回文比較的起點 slow = slow.next; } //進行if處理結束之后,slow代表的是后半段的第一個節點,指針向后移動 //prev代表的是前半段的最后一個節點,指針向前移動 // a b c d c b a 此種情況下slow節點是第2個c,prev節點是第1個c // a b c c b a 此種情況下slow節點是第2個c,prev節點是第1個c //前半部分指針恢復正常處理。將下一個節點記錄下來 ListNode.Node next = middle; while (slow != null) { //進行數據比對。如果不相等則不是回文 if (slow.data != prev.data) { return false; } //前半部分當前節點 ListNode.Node current = prev; //prev向前取節點 prev = prev.next; //slow向后取節點 slow = slow.next; //前半部分指針恢復正常處理。 current.next = next; //本輪處理完之后,將next賦值為當前節點 next = current; } return true;}

四.代碼測試

public static void main(String[] args) { ListNode<String> listNode = new ListNode<String>(); listNode.add('a'); listNode.add('b'); listNode.add('c'); listNode.add('d'); listNode.add('e'); listNode.add('f'); listNode.add('e'); listNode.add('d'); listNode.add('c'); listNode.add('b'); listNode.add('a'); ListNode example = new ListNode(); boolean b = example.isPalindrome(listNode.root); System.out.println('是否是回文:' + b);//true}

五.完整代碼

public class ListNode<T> { /** * 根節點索引位置 */ private int foot; /** * 代表鏈表程度 */ private int count; /** * 標識根節點 */ private Node root; //鏈接點類,內部方法實現,外部使用 private class Node { //數據信息 private T data; //下一個節點引用 private Node next; public Node(T data) { this.data = data; } //添加節點 private void add(T data) { if (this.next == null) { //如果當前節點的next為null,直接創建一個新的節點 this.next = new Node(data); } else { //否則進行遞歸調用,直到最后在某個為空的節點創建一個新節點 this.next.add(data); } } //刪除節點1 public void remove(Node previous, int index) { if (ListNode.this.foot++ == index) { //this表示當前要刪除的節點 previous.next = this.next; this.next = null; ListNode.this.count--; return; } else { //遞歸刪除 this.next.remove(this, index); } } //刪除節點2 public void remove(Node previous, T data) { if (this.data.equals(data)) { previous.next = this.next; this.next = null; ListNode.this.count--; return; } else { if (this.next != null) { this.next.remove(this, data); } else { return; } } } //修改數據 -- 新數據替換舊數據 public void replace(T oldData, T newData) { if (this.data.equals(newData)) { this.data = newData; } else { //遞歸修改,尋找當前節點下一個節點,直到某個節點的值匹配入參 this.next.replace(oldData, newData); } } //修改數據 -- 利用索引修改 public void replace(int index, T newData) { if (ListNode.this.foot++ == index) { //找到了某個值的索引和傳入的索引相同,直接替換 this.data = newData; } else { this.next.replace(index, newData); } } //查詢 public T get(int index) { if (ListNode.this.foot++ == index) { return this.data; } else { return this.next.get(index); } } //鏈表是否包含某個節點 public boolean contains(T data) { //如果當前的這個data正好和傳入的data匹配 if (this.data.equals(data)) { return true; } else { //如果當前的這個不匹配,則需要查找下一個節點 if (this.next == null) { return false; } else { return this.next.contains(data); } } } } public ListNode() { } //檢查鏈表是否為空 public boolean isEmpty() { if (count == 0 || this.root == null) { return true; } else { return false; } } //獲取鏈表的長度 public int size() { return this.count; } //添加 public void add(T data) { if (this.isEmpty()) { //如果鏈表為空,新建一個節點 this.root = new Node(data); } else { this.root.add(data); } this.count++; } //刪除 -- 按照索引刪除 public void remove(int index) { if (this.isEmpty()) { return; } if (index < 0 || this.count <= index) { return; } if (index == 0) { //想要刪除根節點 Node temp = this.root; this.root = this.root.next; temp.next = null; this.count--; return; } else { this.foot = 0; this.root.remove(this.root, index); } } //根據傳入的數值刪除 public void remove(T data) { if (this.isEmpty()) { return; } //如果刪除的正好是根節點 if (this.root.data.equals(data)) { Node temp = this.root; this.root = this.root.next; temp.next = null; this.count--; return; } else { this.root.remove(this.root, data); } } //修改 -- 根據索引修改 public void replace(int index, T newData) { if (this.isEmpty()) { return; } if (index < 0 || this.count <= index) { return; } this.foot = 0; this.root.replace(index, newData); } //修改 -- 新老數據替換 public void replace(T oldData, T newData) { if (this.isEmpty()) { return; } this.root.replace(oldData, newData); } //查詢 --- 根據索引查找 public T get(int index) { if (this.isEmpty()) { return null; } this.foot = 0; return this.root.get(index); } //是否包含 public boolean contains(T data) { if (this.isEmpty()) { return false; } return this.root.contains(data); } //打印 toArray public Object[] toArray() { if (this.isEmpty()) { return null; } int count = this.count; Object[] retVal = new Object[count]; for (int i = 0; i < count; i++) { retVal[i] = this.get(i); } return retVal; } boolean isPalindrome(ListNode.Node head) { if (head == null || head.next == null) { return true; } // ListNode.Node prev = null; //慢指針節點 ListNode.Node slow = head; //快指針節點 ListNode.Node fast = head; //奇數的中位節點或者是偶數的下中位節點 ListNode.Node middle = head; while (fast != null && fast.next != null) { //快指針每次移動2個節點 fast = fast.next.next; //慢指針每次移動1個節點 ListNode.Node next = slow.next; //前半部分的指針反向。反向后前半部分節點的next節點都是他的前一個節點 slow.next = prev; //當前的慢指針指向前一個節點 prev = slow; //下一個節點變為慢節點 slow = next; //記錄中位節點 middle = slow; } //如果fast不是null,說明此時有奇數個節點,偶數個節點時fast為null //還沒有進行if處理之前slow節點和prev節點在奇偶數的情況下分別為 // a b c d c b a 此種情況下slow節點是d,prev節點是第1個c // a b c c b a 此種情況下slow節點是第2個c,prev節點是第1個c if (fast != null) { //slow取中間節點的下一個節點,做為回文比較的起點 slow = slow.next; } //進行if處理結束之后,slow代表的是后半段的第一個節點,指針向后移動 //prev代表的是前半段的最后一個節點,指針向前移動 // a b c d c b a 此種情況下slow節點是第2個c,prev節點是第1個c // a b c c b a 此種情況下slow節點是第2個c,prev節點是第1個c //前半部分指針恢復正常處理。將下一個節點記錄下來 ListNode.Node next = middle; while (slow != null) { //進行數據比對。如果不相等則不是回文 if (slow.data != prev.data) { return false; } //前半部分當前節點 ListNode.Node current = prev; //prev向前取節點 prev = prev.next; //slow向后取節點 slow = slow.next; //前半部分指針恢復正常處理。 current.next = next; //本輪處理完之后,將next賦值為當前節點 next = current; } return true; } public static void main(String[] args) { ListNode<String> listNode = new ListNode<String>(); listNode.add('a'); listNode.add('b'); listNode.add('c'); listNode.add('d'); listNode.add('e'); listNode.add('f'); listNode.add('e'); listNode.add('d'); listNode.add('c'); listNode.add('b'); listNode.add('a'); ListNode example = new ListNode(); boolean b = example.isPalindrome(listNode.root); System.out.println('是否是回文:' + b); }}

以上就是使用JAVA實現單鏈表,檢測字符串是否是回文串的詳細內容,更多關于java封裝單鏈表的資料請關注好吧啦網其它相關文章!

標簽: Java
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美网站| 在线观看一区| 四虎精品永久免费| 午夜精品免费| 中日韩男男gay无套| 欧美成人国产| 色婷婷精品视频| 亚洲91精品| 成人免费网站www网站高清| 给我免费播放日韩视频| 欧美1区二区| 老司机精品视频在线播放| 国产成人精品一区二区三区视频 | 亚洲丝袜美腿一区| 在线 亚洲欧美在线综合一区| 欧美aa一级| 久久亚洲国产| 欧美肉体xxxx裸体137大胆| 99精品视频在线| 久久精品国产68国产精品亚洲| 成人精品动漫一区二区三区| 国产精品115| 成人一区不卡| 国内精品亚洲| 久久福利毛片| 亚洲日本欧美| 亚洲精品裸体| 老司机精品视频在线播放| 欧美精品导航| 高清久久精品| 国产色综合网| 香蕉久久久久久| 国产剧情一区二区在线观看| 麻豆精品新av中文字幕| 成人午夜网址| 欧美国产极品| 久久三级视频| 亚洲综合不卡| 老司机精品在线| 色一区二区三区四区| 欧美成a人免费观看久久| 欧美日韩国产一区精品一区| 日韩中文字幕亚洲一区二区va在线| 国产精品美女久久久| 日韩精品一区二区三区av| 日韩精品免费视频人成| 国产精品流白浆在线观看| 国产一区二区三区91| 久久久成人网| 午夜电影一区| 久久精品人人| 欧美日韩在线观看视频小说| 色狠狠一区二区三区| 国产高清亚洲| 亚洲a在线视频| 丝袜诱惑制服诱惑色一区在线观看| 日韩在线麻豆| 亚洲黄色中文字幕| 一区在线观看| 日韩激情网站| 久久天堂精品| 日本不卡一二三区黄网| 成人小电影网站| 国产毛片久久| 欧美黑人巨大videos精品| 国产精品毛片一区二区三区| 日本麻豆一区二区三区视频| 免费一级欧美片在线观看网站| 99国产精品视频免费观看一公开 | 不卡av一区二区| 欧美日韩一区二区高清| 日韩中文首页| 国产乱码精品一区二区三区四区 | 日韩精品高清不卡| 日韩精品一区二区三区免费观影 | 麻豆精品蜜桃| 国产精品夜夜夜| 黄色av一区| 欧美福利专区| 麻豆中文一区二区| 日韩午夜高潮| 夜鲁夜鲁夜鲁视频在线播放| 亚洲狼人精品一区二区三区| 国产精品日韩精品中文字幕| 免费人成在线不卡| 福利一区二区免费视频| 丝袜亚洲另类欧美| 国产白浆在线免费观看| 免费国产自久久久久三四区久久| 久久成人福利| 免费观看在线色综合| 日本久久精品| 日本午夜免费一区二区| 99久久婷婷| 久久精品免视看国产成人| 日韩国产精品久久久| 99久久久国产精品美女| 美女视频免费精品| 亚洲人成亚洲精品| 欧美精品羞羞答答| 亚洲va中文在线播放免费| 国产美女亚洲精品7777| 午夜性色一区二区三区免费视频| 国产精品99久久精品| 日本欧美在线看| 国内精品福利| 国产成人精品免费视| 日韩欧乱色一区二区三区在线| 欧美日韩国产在线观看网站| 精品国产中文字幕第一页| 日韩高清不卡一区| 蘑菇福利视频一区播放| 91精品一区国产高清在线gif | 精品久久福利| 国产精品色在线网站| 丝袜诱惑制服诱惑色一区在线观看 | 国产亚洲一区| 日韩中文字幕区一区有砖一区| 欧美不卡高清| 日韩高清欧美| 麻豆精品一区二区综合av| 日韩深夜视频| 视频在线观看国产精品| 9999国产精品| 一区在线视频观看| 国产黄大片在线观看| 美国三级日本三级久久99| 国产精品一区二区三区四区在线观看 | 久久国产精品久久久久久电车| 麻豆亚洲精品| 伊人久久av| 麻豆成人在线| 清纯唯美亚洲综合一区| 福利一区二区| 视频二区不卡| 在线一区欧美| 精品国产午夜| 日韩精品一区二区三区免费视频 | 亚洲日本三级| 欧美激情亚洲| 欧美亚洲tv| 老鸭窝毛片一区二区三区| 亚洲免费毛片| zzzwww在线看片免费| 日本不卡高清视频| 综合激情婷婷| 欧美日韩夜夜| 亚欧洲精品视频在线观看| 免费美女久久99| 日韩av黄色在线| 久久精品99国产精品| 日韩av中文字幕一区| 国产精品v一区二区三区| 日韩福利视频导航| 日韩不卡手机在线v区| 国产高清日韩| 精品少妇一区| 精品久久一区| 国产伦久视频在线观看| 加勒比视频一区| av在线最新| 日本一区二区高清不卡| 日韩国产一区二区| 美女网站视频一区| 国产精品av久久久久久麻豆网| 免费久久精品| 青青青国产精品| 精品国产中文字幕第一页| 国产精品蜜芽在线观看| 欧美日韩精品免费观看视欧美高清免费大片 | 久久久久免费| 欧美二三四区| 久久久久国产精品一区二区| 国产91精品对白在线播放| 久久久久免费av| 国产精品美女久久久| 亚洲一区欧美| 国产精品4hu.www| 日韩久久精品| 免费久久99精品国产| 日韩精品一区二区三区免费视频| 奇米色欧美一区二区三区| 国产精品宾馆| 91精品一区二区三区综合| 三级在线观看一区二区| 欧美亚洲tv| 国产一区二区三区四区五区 | 欧美国产美女| 午夜久久影院| 日韩av网站在线免费观看| 久久激情五月婷婷| 精品三级久久久| 中文在线а√天堂| 免费精品视频在线| 乱一区二区av| 狠狠干成人综合网| 国产日韩视频| 国产精品色网| 美腿丝袜亚洲一区| 1024精品久久久久久久久|