题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路分析
循环写法:设置两指针,完成链表的遍历及节点删除,注释里写的很详细了 不多说
递归写法:通过判断条件,设置参数为不重复的节点,如此递归,相当于跳过来所有重复的元素,此写法中,每次的phead节点就相当于循环写法中的pre节点
代码
循环写法
public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } //循环写法 public ListNode deleteDuplication(ListNode pHead){ ListNode first = new ListNode(-1); //设置一个新头结点,用于删除原头结点(如果需要的话) first.next = pHead; //插入到原头结点前,成为新头结点 ListNode current = pHead; //设置一指针,指向当前节点 ListNode pre = first; //前指针,指向前一节点 while (current!=null && current.next!=null){ if (current.val == current.next.val) { int val1 = current.val; //记录重复值 while (current!=null && current.val==val1){ current = current.next; //移动当前节点到下一节点 pre.next = current; //删除pre与current之间的节点 } } else { pre = current; // 不重复则current和pre向后移动 current = current.next; } } return first.next; }
结果
递归写法
public ListNode deleteDuplication(ListNode pHead){ if (pHead==null || pHead.next==null) { return pHead; //考虑边界条件,0个或1个节点的情况 } if (pHead.val == pHead.next.val) { //有重复值的情况 ListNode current = pHead.next; //定义current为输入节点的下一节点 while (current!=null && current.val==pHead.val){ current = current.next; //重复则向后移动,相当于跳过了重复的节点 } return deleteDuplication(current); //从第一个不重复的节点开始递归 } else { //不重复的情况 pHead.next = deleteDuplication(pHead.next); //不重复则保留该节点 return pHead; } }
结果