83
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
解题思路:
1、对于链表,先画图,通过箭头的更改,了解到进行的实际操作是什么
例如:①——》①——》②
需要变成:①——》②
那么需要变化的就是第一个①的下面的那条线从指向第二个①改成指向②即可
也就是①.next = ②
2、对于列表,指针的变化会导致最后难以找到原来头的节点,所以需要进行操作的时候,
一般需要两个指针:
第一个指针,待会用来返回列表,操作列表结束后,从这个指针进行next遍历,可以打印正确的顺序
例如上面的那个例子,我们进行操作结束后,仍然需要从头进行打印,所以指针的位置从一开始都是头节点,从未发生改变
第二个指针,是遍历链表的指针,通过该指针对链表进行前一个元素、该元素以及后一个元素的操作,从而达到节点指向的改变
例如本题只提供单向链表,所以只需要处理好当前节点以及下一个节点的关系即可
3、考虑特殊情况:
本题的特殊情况有,提供的链表为空,链表末尾两个节点数值重复,进行断尾操作
代码:
classSolution {
publicListNodedeleteDuplicates(ListNodehead) {
if(head==null){
returnnull;
}
ListNodecurten=head;//遍历数组的指针
while(curten.next!=null){
if(curten.val==curten.next.val){
if(curten.next.next!=null){
curten.next=curten.next.next;
}else{
//断尾
curten.next=null;
}
}else{
curten=curten.next;
}
}
returnhead;
}
}