• Java实现单链表的增删查改及逆置打印


    //所提供的接口

    LinkList.java

    package Struct;

    public interface LinkList {
    //判断链表为空
    public boolean linkListIsEmpty();
    //尾插
    public void linkListPushBack(Object obj);
    //尾删
    public void linkListPopBack();
    //头插
    public void linkListPushFront(Object obj);
    //头删
    public void linkListPopFront();
    //打印链表
    public void disPlayList(LNode node);
    //查找元素在链表中的位置
    public int linkListFindByEle(LNode node,Object to_find);
    //指定位置查找
    public Object linkListFindByIndex(int index);
    //在pos之后插入元素
    public void linkListInsertAfter(LNode node,int pos,Object obj);
    //删除指定值的元素
    public void linkListRemove(LNode node,Object to_delete);
    //删除指定位置的元素
    public void linkListErase(int pos);
    //求链表长度
    public int linkListSize();
    //链表的逆置
    public LinkList2 reverseList(LinkList2 linkList2);

    }

    //接口的实现

    LinkList2.java

    package Struct;
    class LNode{
    LNode nextNode;//下一个节点的引用
    Object obj;//节点的元素
    public int length;

    //构造函数
    public LNode(Object obj){
    this.obj = obj;
    }
    }


    public class LinkList2 implements LinkList {

    LNode head = null;//创建一个空链表
    LNode tail = head;//尾节点,并记录当前节点的位置
    int count = 0;//统计节点的个数

    //判断链表是否为空
    public boolean linkListIsEmpty() {
    return(count==0);
    }
    //尾插
    public void linkListPushBack(Object obj){
    LNode node = new LNode(obj);
    if(head == null){
    head = node;//链表为空直接插入
    }else{
    tail.nextNode = node;//链表非空直接在tail当前节点的位置进行尾插
    }
    count++;
    tail = node;//置node为前节点
    }
    //尾删
    public void linkListPopBack() {
    if(head == null){
    return;//空链表不可进行尾删操作
    }else{
    while(head.nextNode == tail){
    head = head.nextNode;
    }
    head.nextNode.nextNode = null;
    }
    count--;
    }
    //头插
    public void linkListPushFront(Object obj) {
    LNode node = new LNode(obj);
    if(head == null){
    head = node;
    }else{
    node.nextNode = head;
    head = node;//改变头结点的位置
    }
    count++;
    }
    //头删
    public void linkListPopFront(){
    if(head == null){
    return;//空链表无可删除元素
    }else{
    head = head.nextNode;
    }
    count--;
    }
    //打印链表(node表示从哪个节点开始打印)
    public void disPlayList(LNode node) {
    if(node != null){
    System.out.print(node.obj);
    System.out.print(" ");
    node = node.nextNode;
    disPlayList(node);//递归调用打印函数
    }
    System.out.println();
    }

    //查找元素在链表中的位置
    public int linkListFindByEle(LNode node,Object to_find) {
    if(head == null){
    return -1;//表示空链表,未找到
    }else{
    int index = 0;
    for(;node.obj!=to_find;){
    node = node.nextNode;
    index++;
    }
    return index;
    }
    }

    //查找指定位置的元素
    public Object linkListFindByIndex(int index){
    LNode node = head;
    if(index >= count){
    System.out.println("indexOutOfBoundsException!");
    return -1;//查找位置超过链表长度
    }
    for(int i = 0;i < index;i++){
    node = node.nextNode;
    }
    return node.obj;
    }
    //在指定位置后插入元素
    public void linkListInsertAfter(LNode node,int pos,Object obj){
    LNode node1 = new LNode(obj);
    if(head == null){
    head = node;//空链表直接插入,即pos无效
    }else{
    for(int index = 0;index!=pos;index++){
    node = node.nextNode;
    }
    LNode node2 = node.nextNode;
    node.nextNode = node1;
    node1.nextNode = node2;
    }
    count++;
    }
    //删除指定值的元素
    public void linkListRemove(LNode node,Object to_delete) {
    if(head == null){
    return;//空链表无可删除元素
    }else{
    for(;node.nextNode.obj != to_delete;){
    node = node.nextNode;
    }
    node.nextNode = node.nextNode.nextNode;
    }
    count--;
    }
    //删除指定位置的元素
    public void linkListErase(int pos){
    if(pos >= count){
    //要查找的下标超过链表长度
    System.out.println("indexOutOfBoundsException!");
    return;
    }
    LNode node = head;
    //要删除节点为第一个节点
    if(pos == 0){
    head = head.nextNode;
    count--;
    return;
    }
    //要删除节点为尾节点
    if(pos == count-1){
    //需要找到最后一个节点大的前一个节点
    int temp = 0;
    if(node != null && temp < pos-1){
    //要删除节点的前一个节点
    node = node.nextNode;
    temp++;
    }
    count--;
    return;
    }
    //要删除节点为中间节点
    int temp1 = 0;
    if(node != null && temp1 < pos-1){
    node = node.nextNode;
    temp1++;
    }
    node.nextNode = node.nextNode.nextNode;
    count--;
    }
    //求链表长度
    public int linkListSize() {
    return count;
    }
    //链表的逆置
    public LinkList2 reverseList(LinkList2 linkList){
    LinkList2 reverseLinkList = new LinkList2();
    for(int i = count - 1;i >= 0;i--){
    reverseLinkList.linkListPushBack(linkList.linkListFindByIndex(i));
    }
    return reverseLinkList;
    }

    }

    //测试代码

    package Struct;


    /**
     * @作者:dyy
     * @公司:陕西科技大学
     * @修改日期:
     * @邮箱:1101632375@qq.com
     * @描述:
     */
    public class TestLinkList2 {
    public static void main(String[] args) {
    LinkList2 link = new LinkList2();
            System.out.println(link.linkListIsEmpty());
            System.out.println("尾插四个元素");
       link.linkListPushBack(1);
    link.linkListPushBack(2);
    link.linkListPushBack(3);
    link.linkListPushBack(4);
    link.disPlayList(link.head);
    System.out.println("查找指定元素所在下标");
    System.out.println(link.linkListFindByEle(link.head, 1));
    System.out.println("查找指定下标的元素");
    System.out.println(link.linkListFindByIndex(3));
    link.linkListPopBack();
    link.linkListPopBack();
    System.out.println("尾删两个元素:");
    link.disPlayList(link.head);
    System.out.println("头插两个元素:");
    link.linkListPushFront("lemon");
    link.linkListPushFront("demon");
    link.disPlayList(link.head);
    System.out.println("指定位置后插入");
    link.linkListInsertAfter(link.head, 2, 5);
    link.disPlayList(link.head);
    System.out.println("链表长度:");
    System.out.println(link.linkListSize());
    System.out.println("删除指定值的元素");
    link.linkListRemove(link.head,"lemon");
    link.disPlayList(link.head);
    System.out.println("头删两个元素:");
    link.linkListPopFront();
    link.linkListPopFront();
    link.disPlayList(link.head);
    System.out.println("链表长度:");
    System.out.println(link.linkListSize());
    System.out.println("最终链表为:");
    link.linkListPushFront("哈哈");
    link.linkListPushFront(57);
    link.linkListInsertAfter(link.head, 2, 2);
    link.disPlayList(link.head);

    System.out.println("链表长度:");
    System.out.println(link.linkListSize());

    System.out.println("删除指定位置的元素:");
    link.linkListErase(4);
    link.linkListErase(1);
    link.disPlayList(link.head);
    System.out.println("删除后链表长度:");
    System.out.println(link.linkListSize());

    System.out.println("逆置后的链表");
    link = link.reverseList(link);
    link.disPlayList(link.head);
    }

    }

    运行结果:

  • 相关阅读:
    poj 3258
    CodeForces 367E Sereja and Intervals
    Codeforces Round #240 (Div. 2) C Mashmokh and Numbers
    Codeforces Round #240 (Div. 2) D
    zoj 3768 Continuous Login
    2014/4/4做题感悟
    HDU 1878 欧拉回路
    HDU 3018 Ant Trip
    POJ 3694 Network
    Codeforces Round #239 (Div. 2)
  • 原文地址:https://www.cnblogs.com/edda/p/12595101.html
Copyright © 2020-2023  润新知