您当前的位置: 首页 >  算法

庄小焱

暂无认证

  • 1浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

算法问题——链表

庄小焱 发布时间:2020-08-28 12:27:23 ,浏览量:1

    /**
     * 删除的指定的元素 利用一个指针来实现
     *
     * @param head
     * @return
     */
    public ListNode deletenodevalue(ListNode head, int targe) {
        ListNode dumy = new ListNode(0);
        dumy.next = head;
        ListNode curr = dumy;

        while (curr.next != null) {
            if (curr.next.val == targe) {
                curr.next = curr.next.next;
                continue;
            }
            curr = curr.next;
        }

        return dumy.next;

    }
    /**
     * 删除的指定的元素 利用两个指针来实现
     *
     * @param head
     * @return
     */
    public ListNode deletenodevalue2(ListNode head, int targe) {
        //初始化一个虚拟节点
        ListNode dummy = new ListNode(0);
        //让虚拟节点指向头结点
        dummy.next = head;
        ListNode cur = head;
        ListNode pre = dummy;
        while (cur != null) {
            if (cur.val == targe) {
               cur=cur.next;
               pre.next=cur;
               continue;
            }else {
                pre = pre.next;
                cur = cur.next;
            }
        }
        //最后返回虚拟节点的下一个结点即可
        return dummy.next;
    }
/**
 * Copyright (C), 2018-2020
 * FileName: 指定区间链表翻转
 * Author:   xjl
 * Date:     2020/9/16 14:46
 * Description:
 */
package 牛客面试必会100题;

public class 指定区间链表翻转 {

    public static class ListNode {
        int val;
        ListNode next = null;

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

    /**
     * 将一个链表 m\ m m 位置到 n\ n n 位置之间的区间反转,要求时间复杂度 ,空间复杂度 。
     * 例如:
     * 给出的链表为 1→2→3→4→5→NULL1\to 2 \to 3 \to 4 \to 5 \to NULL1→2→3→4→5→NULL, ,,
     * 返回 1→4→3→2→5→NULL1\to 4\to 3\to 2\to 5\to NULL1→4→3→2→5→NULL.
     *
     * @param head
     * @param m
     * @param n
     * @return
     */
    public static ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dumpy = new ListNode(-1);
        dumpy.next = head;

        ListNode frist = dumpy;
        int a = m - 1;
        while (a > 0) {
            frist = frist.next;
            a--;
        }
        ListNode node = frist.next;
        frist.next = null;

        ListNode second = node;
        int num = n - m;
        while (num > 0) {
            second = second.next;
            num--;
        }
        ListNode node1 = second.next;
        second.next = null;
        //合起来
        ListNode res = reverse(node);
        ListNode next = res;

        while (next.next != null) {
            next = next.next;
        }
        frist.next = res;
        next.next = node1;
        return dumpy.next;
    }

    public static ListNode reverse(ListNode head) {
        ListNode pre = null;
        ListNode curr = head;

        while (curr != null) {
            ListNode future = curr.next;
            curr.next = pre;
            pre = curr;
            curr = future;
        }
        return pre;
    }

    public static void main(String[] args) {
        ListNode s1 = new ListNode(1);
        ListNode s2 = new ListNode(2);
        ListNode s3 = new ListNode(3);
        ListNode s4 = new ListNode(4);
        ListNode s5 = new ListNode(5);

        s1.next = s2;
        s2.next = s3;
        s3.next = s4;
        s4.next = s5;

        ListNode listNode = reverseBetween(s1, 2, 4);
        while (listNode != null) {
            System.out.println(listNode.val);
            listNode = listNode.next;
        }
    }
}

 

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0389s