模拟前移编码策略——《算法》1.3.40

本文介绍了如何模拟前移编码策略,通过Java实现链表操作,包括字符串输入处理、链表节点定义、链表操作以及测试过程。算法在解决异步数据传输和日志记录场景中具有应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法里面有些题挺不错,会提到一些应用场景,比如这个前移编码策略就有点生动:

 算法的实现倒并不复杂,就是链表的应用。链表查询,删除,增加操作。算法介绍应用场景,就会让人印象比较深刻。再比如前面的环形缓冲区问题:

环形缓冲区问题--《算法》1.3.39_自觉的数字公民杨某某的博客-CSDN博客

里面提到这个环形缓冲区和生产消费者线程协作模型对于异步数据传输或者日志记录场景很有用。

回到这个前移编码策略模拟。

方法:

1、字符串的输入与处理-java方式的,尝试了几个,最后用了Scanner输入一行字符串,然后用CharAt取字符。

2、然后建链表的头,在这之前定义一个存储数据的类型node

3、API只有一个方法,就是怎么增加。按照题目要求先遍历链表,然后不管是不是找到,都增加在表头,如果找到,还要把那个删除。

代码的实现:

1、类型node部分:

class CharNode{
    char aChar;
    CharNode next;
    public CharNode(){

    }
    public CharNode(char achar){
        this.aChar = achar;
        this.next = null;
    }
}

2、链表部分

private CharNode head;
public MoveToFront(){
    this.head = new CharNode();
}
public void add(char newchar){
    CharNode temp ;
    CharNode find_node = null;
    if(head.next == null){
        CharNode charNode = new CharNode(newchar);
        head.next = charNode;
    }
    temp = head;
    while(temp.next!= null){
        if(temp.next.aChar == newchar) {
            find_node = temp.next;
            temp.next = find_node.next;
            find_node.next = head.next;
            head.next = find_node;
            break;
        }
        temp = temp.next;
    }
    if(find_node==null){
        find_node = new CharNode(newchar);
        find_node.next = head.next;//abccdgak.
        head.next = find_node;
    }
}

3、测试部分:

public static void main(String[] args) {
    MoveToFront moveToFront = new MoveToFront();
    Scanner scanner = new Scanner(System.in);
    String newline = scanner.nextLine();
    System.out.println(newline);
    for(int i = 0 ; i < newline.length(); i++) {
        char c = newline.charAt(i);
        moveToFront.add(c);
        CharNode temp = moveToFront.head.next;
        System.out.print("update: ");
        while(temp != null){
            System.out.print(temp.aChar);
            temp = temp.next;
        }
        System.out.println();
    }
}

4、测试结果:

abccdgak.
abccdgak.
update: a
update: ba
update: cba
update: cba
update: dcba
update: gdcba
update: agdcb
update: kagdcb
update: .kagdcb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值