题目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
给定一个递增排列的单链表,然后删除其中出现重复的节点。
题解:
此题在《剑指offer》一书中有,非常典型,采用的是设置三个指针,分别指向当前节点,当前节点的前一个节点,当前节点的后一个节点。一开始,当前节点是指向head,然后前一个节点指向null,然后每次都是这个当前指针和后一个指针在往前走,碰到这两个指针指向的节点的值一样,那么就要删除这个节点,其实也就是跳过这个节点,并不做什么处理。但是这里有一个需要注意的点,就是如果碰到要删除的点,那么跳过后,碰到下一个与之前的节点不一样的点了,就得吧之前的那个指针指向这个下一个节点,否则就是使得这个单链表断链。
public static ListNode deleteDuplicates(ListNode head)
{
if(head == null || head.next == null)
return head;
ListNode pre = null;
ListNode node = head;
while(node != null)
{
ListNode next = node.next;
boolean needDelete = false; //设置一个boolean变量,用于判断是否为出现重复节点
if(next != null && next.val == node.val)
needDelete = true;
if(needDelete == false) //如果没有出现,那么就往下走
{
pre = node;
node = node.next;
}
else if(needDelete == true) //如果出现了重复节点
{
int value = node.val;
ListNode ToBeDel = node;
while(ToBeDel != null && ToBeDel.val == value)
{
next = ToBeDel.next;
//System.out.print(next.val + " ");
ToBeDel = null;
ToBeDel = next;
}
if(pre == null) //当碰到不重复的时候,那么就要考虑将之前的那个节点新的指向,如果一开始那个pre为空,第一个几点就出现了重复,那么直接将这个当前节点赋给head,头结点
head = next;
else //否则,就将当前节点作为前一个节点的下一个节点
pre.next = next;
node = next;
}
}
return head;
}
思路其实是非常清晰的,采用三个指针,依次往下走就行了。单链表的题目,还是得多锻炼下多个指针的走向问题。