剑指offer之 链表

(1)Q:删除有序链表中重复的结点。

思路:一个难点是不知道结果的初始节点放在哪里,因为初始节点就有可能是重复结点,因此一个方法是可以设置一个空节点 ListNode first = new ListNode(-1)。

设置一个节点ListNode last = first用来做删除节点的操作。设置结点ListNode p = pHead;用来遍历链表。

遍历链表,如果p结点的下一结点的val值和p结点的val值相同,那么循环将p结点指向下一个不同数值的结点,last.next = p。

如果p结点的下一节点的val值和p结点的val值不同,那么last指向p结点代表此节点不动。

/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null||pHead.next == null){
return pHead;
}
ListNode first =new ListNode(-1);
first.next = pHead;
ListNode last = first;
ListNode p = pHead;
while(p != null && p.next != null){
if(p.next.val != p.val){
last = p;
p = p.next;
}
else{
int val = p.val;
while(p != null && p.val == val){
p = p.next;
}
last.next = p;

}

}
return first.next;
}
}

猜你喜欢

转载自www.cnblogs.com/qingchen-forever/p/11078199.html