【链表】-Lc83-删除有序链表中的重复元素(快慢双指针,slow,fast)
写在前面
最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。
目录
- 写在前面
- 一、场景描述
- 二、具体步骤
- 1.环境说明
- 2.代码
- 写在后面
一、场景描述
删除有序
链表中的重复元素。
示例:
输入:1->2->3->3->5
输出:1->2->3->5
二、具体步骤
1.环境说明
名称 | 说明 |
---|---|
IntelliJ IDEA | 2019.2 |
2.代码
以下为Java版本实现:
public class Lc83_deleteDuplicates {
public static void main(String[] args) {
ListNode n5 = new ListNode(5);
ListNode n31 = new ListNode(3, n5);
ListNode n3 = new ListNode(3, n31);
ListNode n2 = new ListNode(2, n3);
ListNode head = new ListNode(1, n2);
ListNode.print(head);
System.out.println();
ListNode.print(deleteDuplicates(head));
}
/**
* 约束条件:有序链表
* 返回值:链表
*
* 注意条件判断
*
* 思路:
* 有序链表,那么重复的值就会紧挨着
*
* 使用快慢双指针,
* 如果值相等,fast就往后去找不相等的值
* 当值不相等时,就把 fast 的值给 slow.next,然后2个指针同时向后移动
*
* 循环结束,慢指针和后面的节点断开
*
* 定义 slow = head, fast = head.next
* while循环
* if (fast != null) slow.next = fast; slow = slow.next
* fast = fast.next
*
* slow.next = null
*
* @param head
* @return
*/
private static ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null) {
return head;
}
ListNode slow = head, fast = head.next;
while (fast != null) {
if (slow.val != fast.val) {
slow.next = fast;
slow = slow.next;
}
fast = fast.next;
}
slow.next = null;
return head;
}
static class ListNode {
int val;
ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
public static void print(ListNode head) {
while (head != null) {
if (head.next == null) {
System.out.print(head.val);
} else {
System.out.print(head.val + ", ");
}
head = head.next;
}
}
}
}
写在后面
如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。