您的位置:首页 > 职场人生

剑指offer面试题18:删除链表中重复的节点-java

2017-06-23 10:18 239 查看
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路:用递归删除,遇到相同的往后走,返回第一个不相同的节点

public class DeleteDuplication {
public  ListNode deleteDuplication(ListNode head){
// 只有0个或1个结点,则返回
if (head ==null||head.next==null){
return head;
}
// 当前结点是重复结点
if (head.val == head.next.val){
ListNode pNode = head.next;
while (pNode != null && pNode.val == head.val){
// 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
pNode = pNode.next;
}
// 从第一个与当前结点不同的结点开始递归
return deleteDuplication(pNode);
} else {
// 当前结点不是重复结点,保留当前结点,从下一个结点开始递归
head.next = deleteDuplication(head.next);
return  head;
}
}

public static void main(String[] args){
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(3);
ListNode e = new ListNode(4);
ListNode f = new ListNode(4);
ListNode g = new ListNode(5);
a.next=b;
b.next=c;
c.next=d;
d.next=e;
e.next=f;
f.next=g;
DeleteDuplication A = new DeleteDuplication();
ListNode head = A.deleteDuplication(a);
System.out.print(head.val);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: