反转问题(字符串和链表)

最近刷代码随想录的双指针法时,遇到了不少的反转问题。

1、Leetcode 151 反转字符串中的单词(较难的字符串反转问题)

代码随想录说,如果直接使用split函数就变成了一道水题...

但我感觉输入的格式问题也是比较棘手的,我的思路是先找到字符串中第一个不为' '的字符,得到它的索引值,然后遍历到索引为s.length()-2的字符,遍历的字符如果不为' '或者为' '但是下一个字符不为' ',则append到新的StringBuilder中,最后把索引为s.length()-1的字符append到新的StringBuilder,因为索引为s.length()-1的字符的下一个字符会超出索引范围,所以需要单独处理,但是因为只有一个空格,不论最后一个字符是不是空格,split都可以成功的分割(总共的第一步是先去除多余的空格,有点类似移除元素的操作)

然后再使用倒序,即可获得一个新的StringBuilde,通过toString可以转化成目标字符串。

注意事项:

1、StringBuilder的toString()用法需要加括号

2、StringBuilder的append()用法可以是字符串也可以是字符(String没有append用法,只能拼接)

3、String的split()用法生成的是String[]类型(StringBuilder没有split用法)

java 复制代码
class Solution {
    public String reverseWords(String s) {
        StringBuilder temp = new StringBuilder();
        StringBuilder result = new StringBuilder();
        int n = s.length();
        int index = 0;
        for(int i=0;i<n;i++) {
            if(s.charAt(i) != ' ') {
                index = i;
                break;
            }
        }

        for(int i = index; i < n-1; i++) {      
            if( s.charAt(i) != ' ' || (s.charAt(i) == ' ' && s.charAt(i+1) != ' ')) {
                temp.append(s.charAt(i));
            }
        }
        temp.append(s.charAt(n-1));
        
        String[] sub = temp.toString().split(" ");
        for(int i=sub.length-1;i>0;i--) {
            result.append(sub[i]);
            result.append(" ");
        }
        result.append(sub[0]);
        return result.toString();
    }

}

下次使用代码思想录的双指针用法时,再添加上。

2、Leetcode 206 反转链表

该问题比较简单,之前也刷过该题目

但是长期不做链表的题目就容易疏忽一些注意事项

1、链表的head指针不能随便更改

2、在链表的尾部指向的是null

3、初始化用low指针指向null,fast指向head(因为反转必须有左右两个对象),第一次反转时,fast的左对象为null,右对象为原本的下一个节点,从指向右对象,变成了指向左对象,然后通过temp暂存fast原本的下一个节点的位置。(用fast和low命名是为了明确该方法用的也是双指针法,用cur和pre也是可以的)

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode low = null;
        ListNode fast = head;
        ListNode temp = null;

        while(fast != null) {
            temp = fast.next;
            fast.next = low;
            low = fast;
            fast = temp;
        } 

        return low;
        
    }
}
相关推荐
要做朋鱼燕1 小时前
【数据结构】用堆解决TOPK问题
数据结构·算法
秋难降2 小时前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
Jayyih4 小时前
嵌入式系统学习Day19(数据结构)
数据结构·学习
DdduZe4 小时前
8.19作业
数据结构·算法
PyHaVolask5 小时前
链表基本运算详解:查找、插入、删除及特殊链表
数据结构·算法·链表
1白天的黑夜16 小时前
链表-2.两数相加-力扣(LeetCode)
数据结构·leetcode·链表
花开富贵ii6 小时前
代码随想录算法训练营四十六天|图论part04
java·数据结构·算法·图论
熬了夜的程序员6 小时前
【LeetCode】16. 最接近的三数之和
数据结构·算法·leetcode·职场和发展·深度优先
Miraitowa_cheems6 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法
_poplar_8 小时前
08.5【C++ 初阶】实现一个相对完整的日期类--附带源码
c语言·开发语言·数据结构·c++·vscode·算法·vim