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

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

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

瀏覽:24日期: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久久,三上悠亚国产精品一区二区三区
中文字幕av亚洲精品一部二部| 国产精品videossex久久发布| 亚洲精品黄色| 婷婷色综合网| 亚洲调教视频在线观看| 韩国精品主播一区二区在线观看| 精品淫伦v久久水蜜桃| 播放一区二区| 99国产精品| 欧美午夜不卡| 日韩三级久久| 人人爱人人干婷婷丁香亚洲| 婷婷亚洲成人| 日本欧美韩国一区三区| 久久国产麻豆精品| 国产欧美在线| 久久精品国产精品亚洲毛片| 久久国产三级精品| 蜜桃精品视频| 精品国产中文字幕第一页| 日韩综合一区| 久久国产电影| 99国产精品私拍| 亚洲永久精品唐人导航网址| 日韩av中文字幕一区| 国产精品流白浆在线观看| 精品久久国产一区| 婷婷激情久久| 欧美专区18| 日韩有码av| 欧美激情视频一区二区三区在线播放| 精品久久精品| 日韩三区在线| 香蕉久久国产| 91精品国产自产在线丝袜啪| 国产精品嫩模av在线| 蜜臀a∨国产成人精品| 日韩国产欧美在线播放| 久久成人高清| 欧美日韩精品免费观看视欧美高清免费大片 | 国产精品伦理久久久久久| 成人国产精品一区二区免费麻豆| 久久精品电影| 亚洲永久精品唐人导航网址| 日本亚洲三级在线| 久久精品九色| 精品免费av在线| 亚洲图片久久| 精品一级视频| 国产主播一区| 亚洲日产国产精品| 精品三级在线观看视频| 亚洲激情婷婷| 国产伦理久久久久久妇女| 美女av在线免费看| 亚洲综合三区| 免费日韩一区二区三区| 红桃视频国产一区| 国产视频一区二| 99久精品视频在线观看视频| 国产乱码精品一区二区亚洲| 日韩精品一区二区三区免费观影 | 日欧美一区二区| 影音国产精品| 欧美三区四区| 伊人久久大香线蕉av超碰演员| 日韩精品a在线观看91| 久久久久免费| 亚洲久久在线| 色爱av综合网| 欧美日韩亚洲一区| 不卡av一区二区| 国产毛片一区二区三区| 99国产精品99久久久久久粉嫩| 久久精品福利| 亚洲欧洲免费| 久久蜜桃av| 欧美国产极品| 亚洲伊人精品酒店| 久久久久中文| 欧美在线91| 米奇777超碰欧美日韩亚洲| 国产日本久久| 免播放器亚洲| 中文字幕高清在线播放| 欧美中文字幕一区二区| 麻豆精品新av中文字幕| 日韩视频一区| 欧美精品国产| 国产福利一区二区精品秒拍| 丝袜美腿亚洲色图| 久久久久久网| 日韩精品三级| 国产亚洲精品久久久久婷婷瑜伽| 精品日韩一区| 中文一区二区| av资源中文在线天堂| 日本va欧美va精品| 激情五月综合| 91亚洲国产| 国产欧美另类| 亚洲精品裸体| 国产亚洲精品久久久久婷婷瑜伽| 日韩理论视频| 精品丝袜久久| 国产精品久久乐| 亚洲免费成人av在线| 午夜日韩在线| 亚洲不卡av不卡一区二区| 久久精品色播| 热久久久久久久| 图片区亚洲欧美小说区| 丝袜美腿一区| 日韩电影免费网站| 日韩.com| 国产福利电影在线播放| 久久成人av| 国产精品日韩精品中文字幕| 亚洲精品系列| 亚洲精品动态| 久久亚洲视频| 午夜在线一区二区| 国产精品日本| 激情丁香综合| 久久蜜桃av| 日本少妇一区| 四虎4545www国产精品 | 精品一区视频| 精品黄色一级片| 另类欧美日韩国产在线| 精品视频一区二区三区在线观看| 国产精品成人自拍| 麻豆一区二区在线| 欧美极品一区二区三区| 婷婷视频一区二区三区| 伊人久久大香线蕉av超碰演员| 亚洲高清成人| 日韩一区二区三区精品视频第3页| 99久久精品国产亚洲精品| 久久精品天堂| 精品国产成人| а√天堂8资源中文在线| 91一区二区三区四区| 精品日韩一区| 国产精品久久观看| 欧洲一级精品| 亚洲午夜av| 另类国产ts人妖高潮视频| 美国三级日本三级久久99| 青青伊人久久| 国产精品麻豆成人av电影艾秋| 精品丝袜久久| 欧美亚洲精品在线| 老牛影视一区二区三区| 日本一不卡视频| 国产精品视频3p| 日韩欧美二区| 99国产精品久久久久久久成人热| 亚洲精品在线二区| 国产精品视频一区视频二区| а√天堂8资源中文在线| 国产韩日影视精品| 亚洲精品护士| 精品网站999| 久久人人99| 久草精品视频| 亚洲精品2区| 欧美亚洲网站| 国产日韩欧美三级| 牛牛精品成人免费视频| 岛国av在线网站| 福利一区二区免费视频| 欧美日韩视频| 亚洲精品午夜av福利久久蜜桃| 日本色综合中文字幕| 日本不卡不码高清免费观看| 亚洲精品第一| 人人草在线视频| 欧美日韩精品一本二本三本 | 在线天堂中文资源最新版| 91欧美极品| 美女视频网站久久| 国产亚洲精品美女久久 | 免费中文字幕日韩欧美| 亚洲九九精品| 激情不卡一区二区三区视频在线| 欧美日韩精品一区二区视频| 免费观看在线综合| 久久97视频| 国产精品97| 国产精品久久久久77777丨| 亚洲性视频h| 国产精品高潮呻吟久久久久| 激情丁香综合| 久久69成人| 亚洲三级网站| 久久精品影视| 国产精品免费精品自在线观看| 99亚洲视频| 高清在线一区|