您的位置:首页 > Web前端

《剑指offer》——删除链表中重复的结点

2015-11-25 20:07 453 查看
T:

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

题目不难,细心做就行。

code:

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

ListNode(int val) {
this.val = val;
}
}
*/

/**
* T: 删除链表中重复的结点
*
* 题目描述
* 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
* 重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
*
* date: 2015.11.25  19:24
* @author SSS
*
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{

if (pHead == null || pHead.next == null) {
return pHead;
}
// 指向当前情况下没有重复的最后一个元素
ListNode anchorHead = new ListNode(0);
anchorHead.next = pHead;
ListNode preNode = anchorHead;
ListNode postNode = pHead;
boolean flag = false;
while (postNode.next != null) {
if (postNode.next.val == postNode.val) {
postNode.next = postNode.next.next;
flag = true;    // 标记当前有重复元素
// 在重复的情况下,next指针为null了,就把该节点也在此删掉
// 因为下一轮直接退出while循环了
if (postNode.next == null) {
preNode.next = null;
}
} else {
// 当前的postNode也是重复的一个节点
if (flag) {
postNode = postNode.next;
preNode.next = postNode;
flag = false;
} else {
preNode = postNode;
postNode = postNode.next;
}
}
}
return anchorHead.next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: