Java 链表常见考题总结

来源:互联网 发布:ubuntu 14.04 安装 编辑:程序博客网 时间:2024/05/16 00:53

首先定义自定义结点类,存储节点信息:

复制代码
public class Node {    Node next=null;    int data;    public Node(int data){        this.data=data;    }}
复制代码

 

获取链表长度:

复制代码
private int length() {        int length=0;        Node temp=head;        while(temp!=null){            length++;            temp=temp.next;        }        return length;    }
复制代码

 

打印链表:

复制代码
public void printMyList(){        Node temp=this.head;        while(temp!=null){            System.out.print(temp.data);            temp=temp.next;            if(temp!=null){                System.out.print("-->");            }else{                System.out.println();            }        }    }
复制代码

 

向链表中插入数据:

复制代码
public void addNode(int d){        Node node=new Node(d);        if(head==null){            head=node;            return;        }        Node temp=head;        while(temp.next!=null){            temp=temp.next;        }        temp.next=node;    }
复制代码

 

向链表中插入结点:

复制代码
public void addNode(Node node){        if(head==null){            head=node;            return;        }        Node temp=head;        while(temp.next!=null){            temp=temp.next;        }        temp.next=node;    }
复制代码

 

在链表尾部添加另一个链表:

复制代码
public static void  addList(MyLinkedList list,MyLinkedList afterlist) {        Node thishead = list.head;        Node addhead  = afterlist.head;        if(thishead==null){            thishead=addhead;            return;        }        Node temp=thishead;        while(temp.next!=null){            temp=temp.next;        }        temp.next=addhead;    }
复制代码

 

从链表中删除指定位置的数据:

复制代码
public boolean deleteNode(int index){//index:删除的元素的位置        if(index<1||index>length()){            return false;        }        if(index==1){            head=head.next;            return true;        }        int i=2;        Node preNode=head;        Node curNode=preNode.next;        while(curNode!=null){            if(i==index){                preNode.next=curNode.next;                return true;            }            preNode=curNode;            curNode=curNode.next;            i++;        }        return true;    }
复制代码

 

对链表进行排序,返回排序后的头结点:

复制代码
public Node orderList(){        Node nextNode=null;        int temp=0;        Node headNode=head;        while(headNode.next!=null){            nextNode=headNode.next;            while(nextNode!=null){                if(headNode.data>nextNode.data){                    temp=nextNode.data;                    nextNode.data=headNode.data;                    headNode.data=temp;                }                nextNode=nextNode.next;            }            headNode=headNode.next;        }        return head;    }
复制代码

 

从链表中删除重复数据 第一种方法

复制代码
public void deleteRepetition1(){        Hashtable<Integer, Integer>hashtable=new Hashtable<>();        Node temp=this.head;        Node pre=null;        while(temp!=null){            if(hashtable.containsKey(temp.data))            {                pre.next=temp.next;            }            else            {                hashtable.put(temp.data, 1);                pre=temp;            }            temp=temp.next;        }    }
复制代码

 

从链表中删除重复数据 第二种方法:

复制代码
public void deleteRepetition2(){        Node temp=head;        while(temp!=null){            Node i=temp;            while(i.next!=null){                if(temp.data==i.next.data)                {                    i.next=i.next.next;                }                else                {                    i=i.next;                }            }            temp=temp.next;        }    }
复制代码

 

找出单链表中的倒数第k个元素:

复制代码
public Node findLastElem(int k){        if(k<1){            System.out.println("k不合法");            return null;        }        if(head==null){            System.out.println("链表不包含元素");            return null;        }        Node p1=head;        Node p2=head;        for(int i=0;i<k-1;i++){            p2=p2.next;        }        while(p2.next!=null){            p1=p1.next;            p2=p2.next;        }        return p1;        }
复制代码

 

链表反转:

复制代码
public void reversal(){        Node pReversalHead=this.head;        Node pNode=this.head;        Node pPrev=null;        while(pNode!=null){            Node pNext=pNode.next;            if(pNext==null)            {                pReversalHead=pNode;            }            pNode.next=pPrev;            pPrev=pNode;            pNode=pNext;        }        this.head=pReversalHead;    }
复制代码

 

不反转链表,倒序输出链表元素:

复制代码
public void printReversalList(Node pHead){        if(pHead.next==null){            System.out.print(pHead.data);        }        if(pHead.next!=null){            printReversalList(pHead.next);            System.out.print("-->"+pHead.data);        }    }
复制代码

 

寻找单链表中间节点:

复制代码
public Node searchMidNode(){        Node pNode=this.head;        Node qNode=this.head;        while(pNode!=null&&pNode.next!=null&&pNode.next.next!=null){            pNode=pNode.next.next;            qNode=qNode.next;        }        return qNode;    }
复制代码

 

判断一个链表是否有环:

复制代码
public boolean isHaveLoop(){        Node fast=head;        Node slow=head;        if(fast==null){            return false;        }        while(fast!=null&&fast.next!=null){            fast=fast.next.next;            slow=slow.next;            if(fast==slow){                return true;            }        }        return false;    }
复制代码

 

寻找环入口:

复制代码
public Node getLoopStart(MyLinkedList list){        //在链表头和相遇点分别设置一个指针,每次各走一步,两个指针必定相遇,且第一个相遇点为环入口        Node slow=list.head;        Node fast=list.head;        while(slow.next!=null&&fast.next!=null){            slow=slow.next;            fast=fast.next.next;            if(slow==fast){                break;            }        }        while(slow!=fast){            slow=slow.next;            fast=fast.next;        }        return slow;    }
复制代码

 

在不知道头指针的情况下删除指定节点:

复制代码
public boolean deleteNode(Node node){        //此方法不能删除链表最后一个节点,因为无法使其前驱结点的next指向null;        if(node==null||node.next==null){            return false;        }        node.data=node.next.data;        node.next=node.next.next;        return true;    }
复制代码

 

判断两个链表是否相交:

复制代码
public static boolean isIntersect(MyLinkedList list,MyLinkedList list2){        Node head1=list.head;        Node head2=list2.head;        if(head1==null||head2==null){            return false;        }        while(head1.next!=null){            head1=head1.next;        }        while(head2.next!=null){            head2=head2.next;        }        return head1==head2;    }
复制代码

 

寻找两个链表相交的第一个节点:

复制代码
public static Node getFirstMeetNode(MyLinkedList list,MyLinkedList list2){        Node head1=list.head;        Node head2=list2.head;        if (isIntersect(list, list2)==false){            return null;        }        Node t1=head1;        Node t2=head2;        if(list.length()>list2.length()){            int d=list.length()-list2.length();            while(d!=0){                t1=t1.next;                d--;            }        }        else {            int d=list2.length()-list.length();            while(d!=0){                t2=t2.next;                d--;            }        }        while(t1!=t2){            t1=t1.next;            t2=t2.next;        }        return t1;    }
复制代码
原创粉丝点击