【剑指offer】面试题18:删除链表中重复的节点
来源:互联网 发布:知乎股份构成 编辑:程序博客网 时间:2024/05/16 12:19
完整代码地址
完整代码地址
题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
1.用tmpNode和current指向头结点,用一个flag标志遇到连续的重复值
2.current用来遍历整个链表,在遍历时,每当遇到一个新的值的节点,就用tmpNode指向整个节点
3.直到遇到下一个新的值前,current遍历链表,若有相同的值,flag置为false
4.遇到下一个新的值时,若flag为true,则tmpNode没有重复;若flag为false,则tmpNode重复了
5.遍历结束后还要在判断一次
例子:
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
1.tmpNode和current指向1
2.current遍历到2,flag为true,1则加入新的链表中,tmpNode指向2
3.current遍历到3,flag为true,2则加入新的链表中,tmpNode指向3
4.current遍历到第二个3,遇到重复值,flag置为false
5.current遍历到4,flag为false,3这个节点就不管了,flag重新置为true,tmpNode指向4
6.current遍历到第二个4,遇到重复值,flag置为false
7.current遍历到5,flag为false,4这个节点就不管了,flag重新置为true,tmpNode指向5
8.遍历结束,做最后一次判断,flag为true则将5加入新的链表中(若为false则把最后一个节点的next指向null)
代码
/** * 题目: * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 * 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 * * @author peige */public class _18_02_DeleteDuplicatedNode { public static class ListNode { public int val; public ListNode next = null; public ListNode(int val) { this.val = val; } } public static ListNode deleteDuplication(ListNode pHead) { if(pHead == null || pHead.next == null) return pHead; ListNode newHead = new ListNode(0); ListNode node = newHead; boolean flag = true; ListNode tmpNode = pHead; ListNode current = pHead; while((current = current.next) != null) { if(current.val == tmpNode.val) { flag = false; } // 之前没有重复元素 else if(flag == true) { node.next = tmpNode; node = node.next; tmpNode = current; } // 之前有重复元素 else { tmpNode = current; flag = true; } } if(flag == true) node.next = tmpNode; else node.next = null; return newHead.next; }}
测试
public static void main(String[] args) { test1(); test2(); test3();}/** * 功能测试 */private static void test1() { // 1-2-5 ListNode head1 = createListNode(1,2,3,3,4,4,5); head1 = _18_02_DeleteDuplicatedNode.deleteDuplication(head1); printListNode(head1); // 7 ListNode head2 = createListNode(6,6,6,6,6,7); head2 = _18_02_DeleteDuplicatedNode.deleteDuplication(head2); printListNode(head2);}/** * 边界测试 * 1.全是重复元素 * 2.没有重复元素 * 3.只有一个元素 */private static void test2() { // null ListNode head1 = createListNode(6,6,6,6,7,7,7,8,8); head1 = _18_02_DeleteDuplicatedNode.deleteDuplication(head1); printListNode(head1); // 1-2-3-4-5 ListNode head2 = createListNode(1,2,3,4,5); head2 = _18_02_DeleteDuplicatedNode.deleteDuplication(head2); printListNode(head2); // 1 ListNode head3 = createListNode(1); head3 = _18_02_DeleteDuplicatedNode.deleteDuplication(head3); printListNode(head3);}/** * 极端测试 * 1.头结点为null */private static void test3() { // null ListNode head1 = _18_02_DeleteDuplicatedNode.deleteDuplication(null); printListNode(head1);}private static void printListNode(ListNode head) { ListNode cur = head; while(cur != null) { System.out.print(cur.val + " "); cur = cur.next; } System.out.println();}private static ListNode createListNode(int... values) { ListNode head = new ListNode(0); ListNode cur = head; for(int val : values) { cur.next = new ListNode(val); cur = cur.next; } return head.next;}
- 【剑指offer】面试题18:删除链表中重复的节点
- 《剑指Offer》面试题57:删除链表中重复的节点
- 剑指offer面试题18:删除链表中重复的节点-java
- 剑指offer-面试题57:删除链表中重复的结点
- 剑指offer--面试题57:删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 剑指offer-面试题57-删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 剑指offer面试题57 删除链表中重复的结点
- 剑指offer面试题[57]-删除链表中重复的结点
- 【剑指Offer】面试题57:删除链表中重复的结点
- 剑指offer-删除链表中重复的节点
- 剑指offer-----删除链表中重复的 节点
- 《剑指offer》删除链表中重复的节点
- 剑指Offer--删除链表中重复的节点
- 剑指offer面试题18:删除链表的节点-java
- 《剑指Offer》学习笔记--面试题57:删除链表中重复的结点
- PHP代码如何被执行?
- github第二弹
- NodeIo
- SQLSERVER导入CSV表数据
- 大话大前端时代(一) —— Vue 与 iOS 的组件化
- 【剑指offer】面试题18:删除链表中重复的节点
- jsp页面上传Word,用POI读取word里的内容
- RabbitMQ第一篇:RabbitMQ的安装和配置
- Redis基础应用
- Windows下DOS命令大全(经典收藏)
- js中实现cookie的增删改查(document.cookie的使用详情)
- Java关键字abstract
- PHP7特征
- Vim配置 不同的语法高亮显示