One minute
剑指Offer(Java实现)18-1题
面试题18(二):删除链表中重复的结点
问题
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
注意重复的结点不保留:并不是将重复结点删除到只剩一个,而是重复结点的全部会被删除。所以链表1->2->3->3->4->4->5不是1->2->3->4->5
- 思路
- 从头遍历整个链表,如果当前节点的值与下一个节点的值相同,就认为是重复节点,进行删除。为了使删除之后的链表不断开,则把当前节点的前一个节点与后面值比当前节点大的节点相连接。
/**
* @Author GJ1e
* @Create 2019/12/18
* @Time 18:34
*
*/
public class Solution18_1 {
private class ListNode{
int value;
ListNode next = null;
}
public ListNode deleteDuplication(ListNode pHead){
if (pHead==null || pHead.next==null)
return null;
ListNode pNode = pHead;
ListNode pPreNode = null;
while (pNode!=null && pNode.next!=null){
//当前节点和下一个节点的值相同,进入删除。
if (pNode.value == pNode.next.value){
int val = pNode.value; //记录下当前重复节点的值
//把与当前节点值相同的节点全部跳过,出循环的第一个节点就是不重复的节点
while (pNode!=null && (pNode.value==val)){
pNode = pNode.next;
}
if (pPreNode==null){ //头节点就是重复节点,被删除要重新设置头节点。
pHead = pNode;
}else {
pPreNode.next = pNode;
}
//不同则向前推进
}else {
pPreNode = pNode;
pNode = pNode.next;
}
}
return pHead;
}
}
Read other posts