描述
给定单链表的头节点 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;
}
}
}