力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点相关的知识,希望对你有一定的参考价值。

目录

203.移除链表元素

83.删除排序链表中重复元素

82.删除排序链表中重复元素Ⅱ

206.反转链表  ​

876.链表的中间节点 


203.移除链表元素

源代码👇 

https://leetcode-cn.com/problems/remove-linked-list-elements/

public class Num203 
    public static void main(String[] args)
        //创建一个相同的链表
        //[1,2,6,3,4,5,6]
        ListNode head = build();
        Num203 num203 = new Num203();
        ListNode newHead = num203.removeElements(head,6);
        System.out.println(newHead);
    

    private static ListNode build() 
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(6);
        ListNode node4 = new ListNode(3);
        ListNode node5 = new ListNode(4);
        ListNode node6 = new ListNode(5);
        ListNode node7 = new ListNode(6);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        node6.next = node7;
        return node1;
    

    /**
     * 递归
     * 给定一个头节点head的链表 就可以删除链表中所有值val节点
     * @param head
     * @param val
     * @return 返回删除后的头节点
     */
    public ListNode removeElements(ListNode head, int val) 
        if (head == null)
            return null;
        
        //将head.next以及之后的节点处理交给 removeElements(head.next,val)
        head.next = removeElements(head.next,val);
        if (head.val == val)
            return head.next;
        
        return head;
    

    //移除单链表val节点,返回删除后链表的头节点
//    public ListNode removeElements(ListNode head, int val) 
//        //头节点就是待删除的节点
//        while(head != null && head.val ==val)
//            head = head.next;
//        
//        if (head == null)
//            return null;
//        else 
//            //此时头节点一定不是待删除节点且链表不为空
//            ListNode prev = head;
//            while (prev.next != null)
//                if (prev.next.val == val)
//                    ListNode cur = prev.next;
//                    prev.next = cur.next;
//                else
//                    prev=prev.next;
//                
//            
//        
//        return head;
//    

83.删除排序链表中重复元素

源代码👇  

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/

package leetcode;

public class Num83 
    /**
     * 删除排序链表的重复元素,重复元素保留一次
     * @param head
     * @return
     */
    public ListNode deleteDuplicates(ListNode head)
        ListNode dummyHead = new ListNode(101);//虚拟头节点
        dummyHead.next = head;
        ListNode prev = dummyHead;
        ListNode cur = prev.next;
        while (cur!=null)
            if (prev.val == cur.val)
                prev.next = cur.next;//删除cur
            else
                prev=prev.next;//不相等,prev 和 cur都向后移一个单位
            
            cur=cur.next;
        
        return dummyHead.next;
    

82.删除排序链表中重复元素Ⅱ

源代码👇   

 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/submissions/

package leetcode;

public class Num82 
    public ListNode deleteDuplicates(ListNode head) 
        ListNode dummyHead = new ListNode(101);
        dummyHead.next = head;
        ListNode prev = dummyHead;
        ListNode cur = prev.next;
        while (cur!=null)
            ListNode next = cur.next;
            if (next == null)
                return dummyHead.next;
            else
                // 此时链表中至少有两个节点
                if (cur.val == next.val)
                    // cur和next重复
                    // 让next一直向后移动,直到走到第一个与cur.val不相等的节点
                    while (next != null && cur.val == next.val)
                        next = next.next;
                    
                    // prev - 第一个重复节点的前驱
                    // next - 最后一个重复节点的后继
                    // prev - next全是重复元素,需要删除
                    prev.next = next;
                    // prev不动,cur走到当前next继续判断后面是否还有重复元素
                    cur = next;
                else
                    // cur与next不重复
                    prev = prev.next;
                    cur = cur.next;
                
            
        
        return dummyHead.next;
    

206.反转链表  

源代码👇  

https://leetcode-cn.com/problems/reverse-linked-list/submissions/

package leetcode;

import java.util.List;

//反转链表
public class Num206 
    //头插法
//    public ListNode reverseList(ListNode head) 
//        ListNode dummyHead = new ListNode(5001);
//        if (head==null || head.next==null)
//            return head;
//        
//        // 边遍历原链表,边头插新链表
//        while (head!=null)
//            ListNode node = new ListNode(head.val);
//            node.next = dummyHead.next;
//            dummyHead.next = node;
//            head = head.next;
//        
//        return dummyHead.next;
//    
//
    //原地移动法
//    public ListNode reverseList(ListNode head)
//        if (head==null||head.next==null)
//            return head;
//        
//        ListNode prev = null;
//     //当前需要处理的节点(需要反转)
//        ListNode cur = head;
//        while (cur!=null)
//            // 暂存一下下一个需要处理的节点
//            ListNode next = cur.next;
//            cur.next=prev;
//            prev = cur;
//            cur = next;
//        
//        return prev;
//    
//
    //递归法
    public ListNode reverseList(ListNode head) 
        if (head==null||head.next==null)
            return head;
        
        ListNode sec = head.next;
        // 反转第二个节点之后的子链表
        ListNode newHead = reverseList(head.next);
        sec.next = head;
        head.next = null;
        return newHead;
    


876.链表的中间节点 

 源代码👇

https://leetcode-cn.com/problems/middle-of-the-linked-list/

package leetcode;

public class Num876 
    //快慢指针法
    public ListNode middleNode(ListNode head) 
        //fast一次走两步,low一次走一步
        ListNode fast = head;
        ListNode low = head;
        while (fast!=null&&fast.next!=null)
            fast=fast.next.next;
            low=low.next;
        
        return low;
    


本小节完^_^

以上是关于力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点的主要内容,如果未能解决你的问题,请参考以下文章

203. 移除链表元素

203链表-移除链表元素

203链表-移除链表元素

力扣算法JS LC [203. 移除链表元素] LC [206. 反转链表]

LeetCode-203-移除链表元素

链表