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

猜你喜欢

转载自blog.csdn.net/weixin_43872339/article/details/85056395