链表常见的题型java实现

链表是面试中最常见的一种题型,因为他的每个题的代码短,短短的几行代码就可以体现出应聘者的编码能力,所以它也就成为了面试的重点。

链表常见的操作有1.打印链表的公共部分,2.删除链表的倒数第K个节点,3.翻转单向链表,4.环形约瑟夫环问题,5.判断链表是否是一个回文链表,6.两个链表生成相加链表,7.删除无序链表中重复出现的节点,8.删除指定值得节点,9.合并两个有序的单链表,10.环形链表的插入

import java.util.*;
/**********
 *@Author:Tom-shushu
 *@Description:链表问题
 *@Date:21:58 2019/10/2
 *  .--,.--,* ( (  \.---./  ) )
 *  '.__/o   o\__.'
 *     {=  ^  =}
 *      >  -  <
 *     /       \
 *    //       \\
 *   //|   .   |\\
 *   "'\       /'"_.-~^`'-.
 *      \  _  /--'         `
 *    ___)( )(___
 *   (((__) (__)))    高山仰止,景行行止.虽不能至,心向往之。
 *
 **********/
public class Node {
    int value;
    public Node head;
     Node next;

    public Node( data) {
        this.value = data;
    }

    //打印链表的公共部分
    void print(Node head1,Node head2) {
        while (head1 != null && head2 != null) {
            if (head1.value < head2.value) {
                head1 = head1.next;
            } else if (head1.value > head2.value) {
                head2 = head2.next;
            } else {
                System.out.println(head1.value);
                head1 = head1.next;
                head2 = head2.next;
            }
        }
    }

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    删除单链表的倒数第K个节点
    版本一
    public Node remove1(Node head, k) {
        if (head == null || k < 1return head;
        }
        Node cur = head;
        while (cur != ) {
            k--;
            cur = cur.next;
        }
        if (k == 0) {要删除的是第一个
            head = head.next;
        }
        if (k < 0) {
            cur = head;
            while (++k != 0) {
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
         head;
    }

    版本二
    public Node remove2(Node head,1)">null || k <= 0return ;
        }
        Node slow = head;
        Node fast =fast 指向 k + 1
        for (int i = 1; i < k + 1; i++if (fast.next != ) {
                fast = fast.next;
            }  {
                ;
            }
        }
        fast指向尾部,slow指向倒数K+1,即 k 的前一个数。
        while (fast.next != ) {
            fast = fast.next;
            slow = slow.next;
        }
        删除第 k 个数。
        slow = slow.next.next;
        +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    翻转单向链表
     Node reList(Node head) {
        Node pre = ;
        Node next = ;
        while (head != ) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
         pre;
    }

     Node reList2(Node head) {
        null || head.next ==  head;
        }
        Node pre = head;
        Node newHead = while (pre != ) {
            Node temp = pre.next;
            pre.next = newHead;
            newHead = temp;
        }
         newHead;
    }

    环形约瑟夫问题
    public Node yuesefu(Node head,1)"> m) {
        null || head.next == head || m < 1 head;
        }
        Node last =while (last.next != head) {
            last = last.next;
        }
        int count = 0while (head != last) {
            if (++count == m) {
                last.next = head.next;
                count = 0;
            }  {
                last = last.next;
            }
            head =判断一个链表是否是回文链表
    boolean isHuiWen(Node head) {
        Stack<Node> stack = new Stack<Node>();
        Node cur =) {
            stack.push(cur);
            cur =if (head.value != stack.pop().value) {
                false;
            }
            head =true;
    }
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    两个单链表生成相加链表
     Node xinagjialainbiao(Node head1,Node head2) {
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = ();
        ) {
            stack1.push(head1.value);
            head1 = head1.next;
        }
        while (head2 != ) {
            stack2.push(head1.value);
            head2 = head2.next;
        }
        int ca = 0int n1 = 0int n2 = 0int n = 0;
        Node node = ;
        Node pre = while (!stack1.isEmpty() || !stack2.isEmpty()) {
            if (stack1.isEmpty()) {
                n1 = 0 {
                n1 = stack1.pop();
            }
             (stack2.isEmpty()) {
                n2 = 0 {
                n2 = stack2.pop();
            }
            pre = node;
            node = new Node(n % 10);
            node.next = pre;
        }
        if (ca == 1) {
            pre =new Node(1 node;
    }

    删除无需单链表中重复出现的节点
     deletecf(Node head) {
        ;
        }
        HashSet<Integer> set = new HashSet<Integer>();
        Node pre = head;
        Node cur = head.next;
        set.add(head.value);
         (set.contains(cur.value)) {
                pre.next = cur.next;
            }  {
                set.add(cur.value);
                pre = cur;
            }
            cur = cur.next;
        }
    }

    在单链表中删除指定值得节点
    public Node deletevalue(Node head,1)"> num) {
        Stack<Node> stack =  num) {
                stack.push(head);
            }
            head =while (!stack.isEmpty()) {
            stack.peek().next = stack.pop();
        }
        合并两个有序单链表(递归)
     Node Merge(Node list1,Node list2) {
        if (list1 ==  list2;
        }
        if (list2 ==  list1;
        }
        if (list1.value <= list2.value) {
            list1.next = Merge(list1.next,list2);
             list1;
        }  {
            list2.next = Merge(list1,list2.next);
             list2;
        }
    }
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==
    环形链表的插入
    public Node insertNum(Node head,1)"> num){
        Node node = new Node(num);
        if(head == ){
            node.next = node;
             node;
        }
        Node pre = head.next;
        while (cur != head){
            if (pre.value <= num && cur.value >= num){
                break;
            }
            pre = cur;
            cur = cur.next;
        }
        pre.next = node;
        node.next = cur;
        return head.value < num ? head : node;
    }
}

 

相关文章

背景:计算机内部用补码表示二进制数。符号位1表示负数,0表...
大家好,我们现在来讲解关于加密方面的知识,说到加密我认为不...
相信大家在大学的《算法与数据结构》里面都学过快速排序(Qui...
加密在编程中的应用的是非常广泛的,尤其是在各种网络协议之...
前言我的目标是写一个非常详细的关于diff的干货,所以本文有...
对称加密算法 所有的对称加密都有一个共同的特点:加密和...