数据结构与算法(一) 链表(代码示例)

1. 什么是单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

2. 实现单链表的增删操作

1. 插入单链表第i个结点,即插入到ai-1与ai之间的具体步骤:

  1. 找到 ai-1 的引用 p
  2. 生成一个数据域为 x 的新结点 s
  3. 设置p.next = s
  4. 设置s.next = ai

在这里插入图片描述

2. 删除第i个结点

  1. 找到ai-1的存储位置p
  2. p.next指向ai的直接后继结点ai+1

在这里插入图片描述
代码示例:

/**
 * 描述: Java对链表的一些操作
 *
 * @author Ye
 * @version 1.0
 * @date 2021/8/17 17:06
 */
public class MyLinkedList {
   
    /**
     * 链表头的引用
     * */
    Node head = null;

    /**
     * 向链表中插入数据
     * @param data: 插入数据的内容
     * */
    public void addNode(int data){
   
        Node newNode = new Node(data);
        if (head == null){
   
            head = newNode;
            return;
        }
        Node temp = head;
        while (temp.next != null){
   
            temp = temp.next;
        }
        temp.next = newNode;
    }

    /**
     * @param index: 删除第index个结点
     * @return 成功返回true,失败返回false
     * */
    public Boolean deleteNode(int index){
   
        if (index < 1 || index > length()){
   
            return false;
        }
        if (index == 1){
   
            head = head.next;
            return true;
        }
        int i = 2;
        Node preNode = head;
        Node curNode = preNode.next;
        while (curNode != null){
   
            if (i == index){
   
                preNode.next = curNode.next;
                return true;
            }
            preNode = curNode;
            curNode = curNode.next;
            i++;
        }
        return true;
    }

    /**
     * @return 返回结点的长度
     * */
    public int length(){
   
        int length = 0;
        Node temp = head;
        while (temp != null){
   
            length ++;
            temp = temp.next;
        }
        return length;
    }

    /**
     * 对链表进行排序
     * 返回排序后的头结点
     * */
    public Node orderList(){
   
        Node nextNode = null;
        int temp = 0;
        Node curNode = head;
        while (curNode != null){
   
            nextNode = curNode.next;
            while (nextNode != null){
   
                if (curNode.data > nextNode.data){
   
                    temp = curNode.data;
                    curNode.data = nextNode.data;
                    nextNode.data = temp;
                }
                nextNode = nextNode.next;
            }
            curNode = curNode.next;
        }
        return head;
    }


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

    public static void main(String[] args) {
   
        MyLinkedList list = new MyLinkedList();
        list.addNode(95);
        list.addNode(56);
        list.addNode(84);
        list.addNode(44);
        list.addNode(67);
        list.addNode(45);
        list.addNode(58);
        list.addNode(94);
        list.addNode(14);
        list.addNode(7);
        System.out.println("链表长度为: " + list.length());
        System.out.print("排序前: ");
        list.printList();
        list.orderList();
        System.out.print("排序后: ");
        list.printList();
        System.out.println("删除第三个结点后:");
        list.deleteNode(3);
        list.printList();
    }
}

/**
 * 结点类
 *
 * */
class Node{
   
    Node next = null;
    int data;
    public Node(int data){
   
        this.data = data;
    }
}

运行截图:
在这里插入图片描述

3. 删除链表的重复数据

从链表中删除重复数据,可以遍历链表,把遍历到的值存储到一个hashtable,在遍历过程中,若当前访问的值在hashtable中已经存在,则说明这个数据是重复的,因此可以删除。
代码如下:

    /**
     * 删除单链表的重复数据
     * @param head:单链表的头指针
     * */
    public void deleteDuplecate(Node head){
   
        Hashtable<Integer,Integer> table = new Hashtable<>();
        Node temp = head;
        Node pre = n
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单向链表的实现可以使用C++语言来完成。以下是一个简单的单向链表代码示例: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; // 定义链表类 class LinkedList { public: LinkedList() { head = NULL; } // 在链表头部插入节点 void insertAtHead(int val) { ListNode* newNode = new ListNode(val); newNode->next = head; head = newNode; } // 在链表尾部插入节点 void insertAtTail(int val) { ListNode* newNode = new ListNode(val); if (head == NULL) { head = newNode; } else { ListNode* cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = newNode; } } // 删除链表第一个值为val的节点 void deleteNode(int val) { if (head == NULL) { return; } if (head->val == val) { ListNode* temp = head; head = head->next; delete temp; return; } ListNode* cur = head; while (cur->next != NULL && cur->next->val != val) { cur = cur->next; } if (cur->next != NULL) { ListNode* temp = cur->next; cur->next = cur->next->next; delete temp; } } // 遍历链表并输出每个节点的值 void printList() { ListNode* cur = head; while (cur != NULL) { cout << cur->val << " "; cur = cur->next; } cout << endl; } private: ListNode* head; }; // 测试代码 int main() { LinkedList list; list.insertAtHead(1); list.insertAtHead(2); list.insertAtTail(3); list.insertAtTail(4); list.printList(); list.deleteNode(2); list.printList(); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值