删除链表中的所有重复出现的元素/对链表进行奇偶重排

描述

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
在这里插入图片描述
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/odd-even-linked-list

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
在这里插入图片描述
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

实现代码

package com.example.hello.util;

import java.util.*;

class ListNode {
    int val;
    ListNode next = null;

    public ListNode(int i) {
        this.val = i;
    }
}

public class Solution {
    /**
     * 对链表进行奇偶重排
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode evenHead = head.next;
        //定义双指针,奇链表头结点是原链表的头节点。偶链表头结点是原链表的第二个节点
        ListNode odd = head, even = evenHead;
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        //将奇链表和偶链表相连
        odd.next = evenHead;
        return head;
    }

    /**
     * 删除有序链表中所有的重复的元素
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummy = new ListNode(-1);  // 新定义一个链表
        dummy.next = head;   // 将新定义的链表接上原链表
        ListNode prev = dummy;   // 定义靠前的节点为新链表的第一个节点
        ListNode curr = head;   // 定义靠后的节点为原链表的第一个节点
        while (curr != null && curr.next != null) {   // 如果靠后的节点不为空,且其再往后的节点也不为空
            if (curr.val == curr.next.val) {   // 靠后的节点的值等于其再往后的节点的值
                ListNode temp = curr.next;
                while (temp != null && temp.val == curr.val) {   // 如果其再往后的节点不为空,且其再往后的节点的值等于其的值
                    temp = temp.next;  // 则靠后的节点变为其再往后的节点,逐渐往后
                }
                prev.next = temp;
                curr = temp;
            } else {
                prev = prev.next;
                curr = curr.next;
            }
        }
        return dummy.next;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        ListNode listNode = solution.oddEvenList(node1);
        while (listNode != null) {
            System.out.println(listNode.val + " ");
            listNode = listNode.next;
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值