剑指offer系列(56)删除链表中重复的结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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;
		}
	    }


结果



猜你喜欢

转载自blog.csdn.net/sun10081/article/details/80726127