1.删除排序链表的重复元素I
1.1题目:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
代码结果:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode p = head;
while(p != null){
if(p.next != null && p.val == p.next.val){
p.next = p.next.next;
}else{
p = p.next;
}
}
return head;
}
}
2.删除排序链表的重复元素II
2.1题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
代码结果:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode p = head;
ListNode q = dummy;
boolean isDel = false;
while(p != null){
if(p.next != null && p.val == p.next.val ){
isDel = true;
p.next = p.next.next;
}else{
p = p.next;
if(isDel){
q.next = p;
isDel = false;
}else{
q = q.next;
}
}
}
return dummy.next;
}
}
3.分隔链表:
3.1题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
代码结果:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode dummy1 = new ListNode(-1);
ListNode dummy2 = new ListNode(-1);
ListNode p1 = dummy1;
ListNode p2 = dummy2;
while(head != null){
if(head.val < x){
p1.next = head;
p1 = p1.next;
}else{
p2.next = head;
p2 = p2.next;
}
head = head.next;
}
p2.next = null;
p1.next = dummy2.next;
//dummy2.next = null;
return dummy1.next;
}
}
4.翻转链表II:
4.1题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
代码结果:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
for(int i = 0;i < m -1;i++){
pre = pre.next;
}
ListNode cur = pre.next;
ListNode node = null;
for(int i = 0;i < n - m + 1;i++){
ListNode temp = cur.next;
cur.next = node;
node = cur;
cur = temp;
}
pre.next.next = cur;
pre.next = node;
return dummy.next;
}
}