单链表逆序(三种方式)

三种方式实现单链表的逆序,分别是头结点插入,对称交换和利用堆栈来实现。三种方式分别是出于空间和时间的考虑来实现的,详见注释。

public class LinkedList {

    class Node {
        private Node next;
        private Object data;

        public Node() {
            super();
        }

        public Node(Object data, Node next) {
            this.data = data;
            this.next = next;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }

        public Object getData() {
            return data;
        }

        public void setData(Object data) {
            this.data = data;
        }
    }

    private Node head;

    public Node first() {
        return head.next;
    }

    public Node tail() {
        Node temp = head;
        while (temp.next != null)
            temp = temp.next;
        return temp;
    }

    public Node head() {
        return head;
    }

    public LinkedList() {
        head = new Node(null, null);
    }

    public boolean addStack(Object data, Node head) {
        boolean flag = false;
        Node node = new Node(data, null);
        if (!flag) {
            node.next = head.next;
            head.next = node;
            flag = true;
        }
        return flag;
    }

    public boolean addQueue(Object data, Node head) {
        Node temp = head;
        while (temp.next != null)
            temp = temp.next;
        boolean flag = false;
        Node node = new Node(data, null);
        if (!flag) {
            temp.next = node;
            flag = true;
        }
        return flag;
    }

    public void print(Node head) {
        Node temp = head;
        while (temp.next != null) {
            System.out.println("list node data :" + temp.data);
            temp = temp.next;
        }
        System.out.println("list node data :" + temp.data);
    }

    public void addQueue() {

    }
//直接头结点插入
    public LinkedList invertedList(Node head) {
        LinkedList newList = new LinkedList();
        Node temp = head;
        while (temp.next != null) {
            addStack(temp.data, newList.head);
            temp = temp.next;
        }
        addStack(temp.data, newList.head);
        return newList;
    }

    public int length() {
        Node temp = head;
        int i = 0;
        while (temp.next != null) {
            i++;
            temp = temp.next;
        }
        return i;
    }
//交换两个对应的数据来实现,链表逆序
    public void invertedListExchange(Node head) {
        Node tempStart = head;
        Object old = null;
        Node tempEnd = null;
        int halfLen = this.length() / 2;
        for (int i = 0; i < halfLen; i++) {

            tempEnd = tempStart;

            if (i == 0) {
                tempEnd = this.tail();
            }

            while (i != 0 && tempEnd.next.data != old)
                tempEnd = tempEnd.next;
            System.out.println(tempStart.data);
            Object tt = tempStart.data;
            tempStart.data = tempEnd.data;
            tempEnd.data = tt;
            old = tempEnd.data;

            tempStart = tempStart.next;
        }
    }
//利用栈的性质来实现
    public LinkedList invertedListByStack(Node head) {
        Deque<Object> stack = new java.util.LinkedList<Object>();
        Node temp = head;
        while (temp.next != null) {
            stack.push(temp.data);
            temp = temp.next;
        }
        stack.push(temp.data);
        LinkedList newList = new LinkedList();
        Node node = newList.head;
        while (!stack.isEmpty()) {
            addQueue(stack.pop(), node);
        }

        return newList;
    }

}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值