1. 程式人生 > >82.刪除排序連結串列中的重複元素

82.刪除排序連結串列中的重複元素

在這裡插入圖片描述
這個題一開始沒寫出來,我當時的思路是在找一個父節點而對於父節點怎麼設定無從下手。

下面這個演算法是首先建立一個父節點,然後去遍歷整個連結串列如果連結串列不為空的話繼續迴圈
而對於一個連結串列有兩種情況的點。
一個:點是當前節點的值等於下一個節點的值。如果相等需要找到所有相等的值然後複製給父節點。
另一個:是當前節點的值不等於下一個節點的值。不相等的話就繼續往下面遍歷。

對於連結串列自己的一點點誤區,是在迴圈的時候到底是選擇head!=null 還是採用head.next!=null
現在的理解是:如果需要比較的臨近的ListNode的話需要採用的條件是head.next!=null && head != null
如果比較的不是相鄰的兩個ListNode而是在遍歷比較的話則需要比較的是 head!=null

public class Solution {
	public static ListNode deleteDuplicates(ListNode head){
		ListNode fatherNode = new ListNode(-1);
		ListNode p = fatherNode;
		while(head != null && head.next!=null){
			if(head.val == head.next.val){
				while(head.next!=null && head.val == head.next.val){
					head = head.next;
				}
				head = head.next;
			}else{
				p.next = head;
				p = p.next;
				head = head.next;
			}
		}
		p.next = head;
		return fatherNode.next;
	}
	public static void main(String[] args){
		ListNode l1 = new ListNode(1);
		ListNode l2 = new ListNode(2);
		ListNode l3 = new ListNode(3);
		ListNode l4 = new ListNode(3);
		ListNode l5 = new ListNode(4);
		ListNode l6 = new ListNode(4);
		ListNode l7 = new ListNode(5);
		l1.next = l2;
		l2.next = l3;
		l3.next = l4;
		l4.next = l5;
		l5.next = l6;
		l6.next = l7;
		l7.next = null;
		ListNode temp = deleteDuplicates(l1);
		
		while(temp!=null){
			System.out.print(temp.val+" ");
			temp = temp.next;
		}
		
	}
	
}