链表逆置算法

顺序表的逆置算法

import java.util.Arrays;

public class Nizhi {
    private ListStatus front;

    public Nizhi(){
        front=new ListStatus();
    }

    protected void addElem(Object elem){
        if(elem==null) return;
        if(front.size>front.MAXSIZE) return;//满
        front.data[front.size++]=elem;
    }

    protected void print(){
        System.out.println(Arrays.toString(front.data));
        System.out.println(front.size);
    }

    /**
     * 顺序表逆置算法
     */
    protected void Revelt(){
        int p=0;
        while (p<(front.size/2)){
            Object temp;
            temp=front.data[p];
            front.data[p]=front.data[front.size-1-p];
            front.data[front.size-1-p]=temp;
            p++;
        }

    }

    public static void main(String[] args) {
        Nizhi nizhi=new Nizhi();
        for (int i=0;i<10;i++){
            nizhi.addElem(i);
        }
        nizhi.print();
        nizhi.Revelt();
        nizhi.print();

    }


}

public class ListStatus {
    protected  Object[] data;
    protected  int size;
    protected  int MAXSIZE;
    public ListStatus(){
        MAXSIZE=20;
        size=0;
        data=new Object[MAXSIZE];
    }
    protected ListStatus(int maxsie){
        this.MAXSIZE=maxsie;
        data=new Object[MAXSIZE];
        size=0;
    }

}

单链表倒置

/**
 * 单链表的存储结构
 */
public class LinkList {

    private NodeSql head;//定义头结点
    private NodeSql tail;//尾指针
    private static int size = 0;

    public LinkList() {
        head = new NodeSql();//
    }


    /**
     * 获取链表第一个数据的算法思路
     * 1.声明一个节点p,初始化j=1
     * 2.
     * 3.j<i 结点向后移动,j+1
     * 4.若p到到末尾没有找到元素,表示元素不存在
     * 5.返回指定元素
     *
     * @param i
     * @param elem
     */
    public Object getElem(int i, Object elem) {
        NodeSql p;//指向第一个元素
        int j = 1;
        p = head;
        while (p.next != null && j < i) {
            p = p.next;
            ++j;
        }
        elem = p.data;
        return elem;


    }

    /**
     * 思路:在i位置插入元素
     * 1.声明一个节点p,初始化讲
     * 2.p指向第一个结点‘
     * 3.p不为空j<i,进行移动 p=p.next j++
     * s.next=p.next
     * p.next=s
     */
    public void insertelem(int i, Object elem) {
        NodeSql p;//初始化一个结点p,指向第一个结点
        int j = 1;
        p = head;
        while (p.next != null && j < i) {
            p = p.next;
            ++j;
        }
        if (p == null || j > i) return;
        NodeSql s = new NodeSql(elem);
        s.next = p.next;
        p.next = s;


    }

    /**
     * 添加结点
     * 为空判断
     *
     * @param elem
     */
    public void addNode(NodeSql elem) {
        NodeSql temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = elem;
    }

    /**
     * 尾结点插入
     * 平均时间复杂度O(n)
     *
     * @param elem
     */
    public void addTailElem(Object elem) {
        NodeSql p;
        p = head;
        //找到插入点
        while (p.next != null) {
            p = p.next;
        }
        //找到最后一个点,在尾结点就行插入,new 一个新结点
        NodeSql s = new NodeSql(elem);
        s.next = p.next;
        p.next = s;
    }

    /**
     * 尾插入时间复杂度O(1)
     *
     * @param elem
     */
    public void addTailElemExtend(Object elem) {
        //尾指针指向头结点
        NodeSql r = null;

        if (tail == null) {
            tail = head;

        }
        r = tail;
        //插入元素 new 一个新的结点
        NodeSql s = new NodeSql(elem);
        s.next = r.next;
        r.next = s;
        tail = s;
    }

    /**
     * 头插入
     * 时间复杂度为O(1)
     */
    protected void addHeadElem(Object elem) {
        NodeSql r;
        r = head;
        NodeSql s = new NodeSql(elem);
        s.next = r.next;
        r.next = s;

    }

    public void print() {
        NodeSql temp = head.next;
        while (temp != null) {
            System.out.print(temp.data + "  ");
            if (temp.next == head) {
                temp = null;
            } else {
                temp = temp.next;
            }


        }

    }

    /**
     * 删除结点
     * 初始化j=1
     * 循环 找到第i个结点
     * 找到某个结点
     * 删除p->next=p->next->kkonext
     *
     * @param i
     * @return
     */
    public boolean deleteelem(int i) {
        NodeSql p, q;
        int j = 1;
        p = head;
        while (p.next != null && j < i) {
            p = p.next;
            ++j;

        }
        if (p == null || j > i) {
            return false;
        }
        q = p.next;
        p.next = q.next;
        q = null;
        return true;

    }

    /**
     * 单链表的逆置算法
     */
    protected void Revert() {
        NodeSql p, q;
        NodeSql r;
        p = head.next;
        q = head;
        q.next=null;
        //从第一个结点开始进行尾插入
        while (p != null) {
            r = p.next;
            p.next = q.next;
            q.next = p;
            p = r;
        }


    }


    public static void main(String[] args) {
        LinkList list = new LinkList();
        for (int i = 0; i < 10; i++) {
            list.addTailElem(i);
        }
        list.print();
        System.out.println();
        list.Revert();
        list.print();
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值