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;
}
}
}