面试题57. 删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
定义三个结点 pre、h、post,分别表示前驱、当前和后继。 然后扫描整个链表:
- 如果h.val 不等于 post.val,那么pre、h、post依次向后移动一位
- 反之,post不断后移,直到遇到val不相等的结点
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode deleteDuplication(ListNode head) {
ListNode h = head, pre = new ListNode(0);
pre.next = h;
ListNode post = null;
while(h != null && (post = h.next) != null) {
if(h.val != post.val) { // 如果不相等,pre、h、post就依次向后移动一位
pre = h;
}else { // 如果相等,
while(post != null && h.val == post.val) { // post 不断向后移动
post = post.next;
}
if(pre.next == head) { // 如果是从头结点开始就一直重复
head = post; // 注意,如果从头结点就开始重复,需要修改head
}
pre.next = post;
}
h = post;
}
return head;
}
}