用加头节点实现链表的删除重复元素、分割、翻转(Java实现)

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;
    }
}
原文地址:https://www.cnblogs.com/youdiaodaxue16/p/11207356.html