剑指Offer(Java实现)删除链表中重复的结点
生活随笔
收集整理的這篇文章主要介紹了
剑指Offer(Java实现)删除链表中重复的结点
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
在一個排序的鏈表中,存在重復(fù)的結(jié)點,請刪除該鏈表中重復(fù)的結(jié)點,重復(fù)的結(jié)點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5。
解題思路
先新建一個頭節(jié)點,然后向后查找值相同的結(jié)點,重復(fù)查找后刪除
代碼實現(xiàn)
/*public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;} } */ public class Solution {public ListNode deleteDuplication(ListNode pHead) {if (null == pHead) {return null;}// 新建一個結(jié)點,防止頭結(jié)點被刪除 ListNode firstNode = new ListNode(-1);firstNode.next = pHead;// 記錄前驅(qū)結(jié)點ListNode preHead = firstNode;// 記錄當前遍歷結(jié)點ListNode p = pHead;while ((null != p) && (null != p.next)) {// 若結(jié)點值出現(xiàn)重復(fù)if (p.val == p.next.val) {int val = p.val;// 刪除重復(fù)結(jié)點while ((null != p) && (val == p.val)) {p = p.next;}// 刪除重復(fù)結(jié)點后,進行鏈接preHead.next = p;} else {// 結(jié)點不重復(fù),后移preHead = p;p = p.next;}}return firstNode.next;} }注意
while ((null != p) && (val == p.val)) {p = p.next; }其中,條件中的 (null != p) && (val == p.val) 不可以顛倒,否則會引發(fā)空指針異常。
因為,此時當循環(huán)到達p指向鏈表的末尾時,此時p.next為空,則p=p.next,p為null。若先判斷 (val == p.val) 會因p=null,使得讀取p.val時發(fā)生空指針異常;若先判斷 (null != p) ,則已不再滿足循環(huán)條件,由“&&”的截斷機制,不再繼續(xù)執(zhí)行判斷。
總結(jié)
以上是生活随笔為你收集整理的剑指Offer(Java实现)删除链表中重复的结点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指Offer(Java实现)扑克牌顺子
- 下一篇: 剑指Offer(Java实现)把字符串转