java实现链表及其相关操作

来源:互联网 发布:三国无双7捏脸数据 编辑:程序博客网 时间:2024/06/06 03:14

java实现链表及其相关操作 ,如下所示:

  • 头插法
  • 尾插法
  • 遍历
  • 倒置
  • 在有序的链表中插入一个数还是有序
  • 在有序的链表中删除一个数还是有序
  • 合并两个有序列表

Node文件代码如下:

public class Node {    Object data;    Node next;    public Object getData() {        return data;    }    public void setData(int data) {        this.data = data;    }    public Node() {        // TODO Auto-generated constructor stub        this.data = null;    }    public Node(int data) {        // TODO Auto-generated constructor stub        this.data = data;    }    /**     * 头插法建立链表     * @param length 链表的长度,这里先设定初始长度     * @return 链表的头指针     */    public Node createListF(int length) {        Node head,s;        head = new Node();        head.next = null;        for (int i=1; i<=length; i++) {            s = new Node(i);            s.next = head.next;            head.next = s;        }           return head;    }    /**     * 尾插法建立链表     * @param length 链表的长度,这里先设定初始长度     * @return 链表的头指针     */    public Node createListR(int length) {        Node head,rear,s;        head = new Node();        rear = head;        for (int i=1; i<=length; i++) {            s = new Node(i);            rear.next = s;            rear = s;        }        rear.next = null;        return head;    }    public void traverseList(Node head) {        Node p = head.next;        while(p != null) {            System.out.print(p.data + " ");            p = p.next;        }        System.out.println();    }    /**     * 链表反转     * @param head 反转前链表的头指针     * @return head 反转后链表的头指针     */    public Node reverseList(Node head) {        Node p,q,temp;        p = head.next;        q = p.next;        while (q != null) {            temp = q.next;            q.next = p;            p = q;            q = temp;        }        head.next.next = null;        head.next = p;        return head;    }    /**     * 在有序的链表中插入一个数还是有序     * @param head 插入前链表的头指针     * @param x 要插入的值     * @param asc 初始链表是否升序     * @return head 插入后链表的头指针     */    public Node insertDataInOrderedList(Node head,int x,boolean asc) {        Node p,s,q;        q = head;        p = q.next;        if (asc) {            //升序            while ((p != null) && (Integer.parseInt(p.data == null?"":p.data.toString())) <= x) {                q = p;                p = p.next;            }            s = new Node(x);            q.next = s;            s.next = p;            p = null;            q = null;        } else {            while ((p != null) && (Integer.parseInt(p.data == null?"":p.data.toString())) >= x) {                p = p.next;                q = q.next;            }            s = new Node(x);            q.next = s;            s.next = p;            p = null;            q = null;        }        return head;    }    /**     * 在有序的链表中删除一个数还是有序     * @param head     * @param x     * @param asc     * @return     */    public boolean deleteDataInOrderedList(Node head, int x,boolean asc) {        Node p,q;        q = head;        p = q.next;        while ((p != null) && (Integer.parseInt(p.data == null?"":p.data.toString())) != x) {            q = p;            p = p.next;        }        if(p == null) {            return false;        }        q.next = p.next;        p = null;        q = null;        return true;    }    /**     * 合并两个有序列表     * @param head1     * @param head2     * @return     */    public Node mergeTwoOrderedList(Node head1,Node head2) {        Node head,p1 = head1.next,p2 = head2.next; //p1,p2分别为head1,head2的游标        head = new Node(); //生成头结点        head.next = null;        while (p1 != null && p2 != null) {            if (objToInt(p1.data) <= objToInt(p2.data)) {                head.addNodeAtTheEnd(head, objToInt(p1.data));                p1 = p1.next;            } else {                head.addNodeAtTheEnd(head, objToInt(p2.data));                p2 = p2.next;            }        }        while(p1 != null) {            head.addNodeAtTheEnd(head, objToInt(p1.data));            p1 = p1.next;        }        while(p2 != null) {            head.addNodeAtTheEnd(head, objToInt(p2.data));            p2 = p2.next;        }        return head;    }    /**     * 在链表的末端追加元素     * @param head 原来链表的头指针     * @param x 所追加元素的值     * @return head 追加元素之后的链表的头指针     */    public Node addNodeAtTheEnd(Node head,int x) {        Node q = head,p = q.next;        while (p != null) {            q = p;            p = p.next;        }        Node newNode = new Node(x);        q.next = newNode;        newNode.next = null;        return head;    }    /**     * Object转化为int     * @param obj     * @return     */    public int objToInt(Object obj) {        return Integer.parseInt(obj == null ? "" : obj.toString());    }}

Test文件代码如下:

public class Test {    public static void main(String[] args) {        Node node = new Node();        Node head = node.createListF(6);        System.out.print("头插法建立的链表:");        node.traverseList(head);        System.out.print("反转后的链表:");        head = node.reverseList(head);        node.traverseList(head);        System.out.print("插入值为4的数之后的链表:");        head = node.insertDataInOrderedList(head, 4, true);        node.traverseList(head);        System.out.print("删除链表中第一个值为5的数,是否成功?");        boolean isDeleted = node.deleteDataInOrderedList(head, 5, true);        if (isDeleted) {            System.out.print("已被删除!");            System.out.println();        }        System.out.print("删除链表中第一个值为5的数之后的链表:");        node.traverseList(head);        System.out.print("新增值为10的结点:");        node.addNodeAtTheEnd(head, 10);        node.traverseList(head);        Node newHead = node.createListR(10);        System.out.print("原来的head链表:");        node.traverseList(head);        System.out.print("原来的newHead链表:");        node.traverseList(newHead);        Node mergeNode = node.mergeTwoOrderedList(head, newHead);        System.out.println("Merge two linklist:");        node.traverseList(mergeNode);    }}

小白所写,有错误请指出。

0 0
原创粉丝点击