实现单链表的基本操作

实现单链表的基本操作

  1. 头插
  2. 尾插
  3. 获取长度
  4. 包含元素
  5. 移除元素
package Demo;

public class LinkedList {
    private LinkedNode head = null;
    public void addFirst(int elem){
        //先创建一个节点,让这个节点的值就是 elem
        LinkedNode node = new LinkedNode(elem);
        if(this.head == null) {
            //空链表的情况
            this.head = node;
            return;
        }
        //如果不是空链表,就需要把新的节点放到链表的开始位置上
        node.next = head;
        this.head = node;
        return;
    }

    public void addLast(int elem) {
        LinkedNode node = new LinkedNode(elem);
        //如果是空链表,直接把这个节点放在去即可
        if(this.head == null){
            this.head =  node;
            return;
        }
        //非空的情况,需要先找到最后一个节点
        LinkedNode cur = this.head;
        while(cur.next != null) {
            cur = cur.next;
        }
        cur.next = node;
    }

    public void addIndex(int index,int elem){
        LinkedNode node = new LinkedNode(elem);
        //1.先对 pos 进行一个合法性的校验,需要知道链表的长度
        int len size();
        if(index < 0 || index > len) {
            return;
        }
        //2.处理头插的情况
        if(index == 0) {
            addFirst(elem);
            return;
        }
        //3.处理尾插
        if(index == len) {
            addFirst(elem);
            return;
        }
        //4.处理插入到中间位置的情况
        //prev 这个引用就对应到 index - 1的位置
        LinkedNode prev = getIndexPos(index -1);
        //5.完成具体的插入过程
        node.next = prev.next;
        prev.next = node;
    }

    private LinkedNode getIndexPos(int index){
        //是否要判断一下index 是在有效范围中呢
        LinkedNode cur = this.head;
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        return  cur;
    }

    public  int size(){
        int size = 0;
        for(LinkedNode cur = this.head; cur != null; cur = cur.next) {
            size ++;
        }
        return size;
    }
   public boolean contains(int toFind){
        //直接遍历链表,依次比较每个元素就行
       for(LinkedNode cur = this.head;cur != null; cur = cur.next) {
           if(cur.data ==toFind){
               return turn;
           }
       }
       return false;
   }
   
   public void remove(int toRamove) {
        //1.先单独处理下空链表的情况
       if(head == null) {
           return;
       }
       //2.先考虑是否要删除的是头结点
       if(head.data == toRamove) {
           this.head = this.head.next;
           return;
       }
       //3.删除中间的节点,找到要删除元素的前一个元素
       LinkedNode prev = searchPrev(toRemove);
       LinkedNode nodToRemove = prev.next;
       prev.next = nodeToRemove.next;
   }
   
   private LinkedNode searchPrev(int toRemove) {
        //找到要删除元素的前一个位置
       if(this.head == null) {
           return null;
       }
       LinkedNode prev = this.head;
       while (prev.next != null) {
           if(prev.next.data == toRemove) {
               return prev;
           }
           prev = prev.next;
       }
       //返回 null表示没找到
       return null;
   }
   
   public  void display(){
        //打印链表中的所有元素
       System.out.print("[");
       for(LinkedNode node = this.head; node != null; node = node.next) {
           System.out.println(node.data);
           if(node.next !=null) {
               //如果不是最后一个元素就加上,否则不加
               System.out.println(",");
           }
       }
       System.out.println("]");
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,它由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。下面是C语言实现单链表基本操作的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构 struct Node { int data; struct Node* next; }; // 创建新节点 struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode == NULL) { printf("内存分配失败!\n"); exit(1); } newNode->data = data; newNode->next = NULL; return newNode; } // 在链表末尾插入节点 void append(struct Node** head, int data) { struct Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; return; } struct Node* current = *head; while (current->next != NULL) { current = current->next; } current->next = newNode; } // 在链表头部插入节点 void prepend(struct Node** head, int data) { struct Node* newNode = createNode(data); newNode->next = *head; *head = newNode; } // 在指定位置插入节点 void insertAfter(struct Node* prevNode, int data) { if (prevNode == NULL) { printf("前一个节点不能为空!\n"); return; } struct Node* newNode = createNode(data); newNode->next = prevNode->next; prevNode->next = newNode; } // 删除指定数据的节点 void deleteNode(struct Node** head, int data) { struct Node* temp = *head; struct Node* prevNode = NULL; if (temp != NULL && temp->data == data) { *head = temp->next; free(temp); return; } while (temp != NULL && temp->data != data) { prevNode = temp; temp = temp->next; } if (temp == NULL) { printf("未找到要删除的节点!\n"); return; } prevNode->next = temp->next; free(temp); } // 打印链表 void printList(struct Node* head) { struct Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } // 测试代码 int main() { struct Node* head = NULL; // 插入节点 append(&head,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值