Java链表及字符串反转问题集
来源:互联网 发布:下载最快的软件 编辑:程序博客网 时间:2024/06/08 05:14
1、实现单链表反转(递归反转、遍历反转法)
定义一个结点类:public class Node { private int data; //数据域 private Node next; //指针域 public Node(int data) { super(); this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }递归反转:public static Node reverse(Node head){ //如果是空链表或者尾结点 if (head==null||head.getNext()==null) { return head; }//先反转后续结点 Node reversedHead=reverse(head.getNext());//当前结点指针指向前一结点 head.getNext().setNext(head);//令前一结点的指针域为null head.setNext(null); return reversedHead; }遍历反转:public static Node reverse1(Node head){ if (head==null) { return head; }//上一结点 Node pre=head;//当前结点 Node cur=head.getNext();//用于存储下一节点 Node tem;//cur==null 即尾结点 while(cur!=null){//下一节点存入临时结点 tem=cur.getNext();//将当前结点指针指向上一节点 cur.setNext(pre);//移动指针 pre=cur; cur=tem; } head.setNext(null); return pre; }2、将一个字符串的部分位置进行反转。如将"abcdefg"反转为"abfedcg"
@Testpublic void test5(){String str = new String("abcdefg");String str1 = reverseString(str, 2, 5);System.out.println(str1);System.out.println(str);}public String reverseString(String str,int start,int end){char[] cs = str.toCharArray();return reverseArray(cs, start, end);}public String reverseArray(char[] cs,int start,int end){for(int x = start,y = end;x < y;x++,y--){char temp = cs[x];cs[x] = cs[y];cs[y] = temp;}return new String(cs);}//另一种方法public static String myReserve2(String str,int start,int end){String str1 = str.substring(0, start);for(int i = end; i > start;i--){str1 += str.charAt(i);}str1 += str.substring(end);return str1;}
3、实现字符串从头到尾的反转
public class StringReverseExe {public static void main(String[] args) {String str = "helloWorld";//方法一:String str1 = reverse1(str);System.out.println(str1);System.out.println("---------------");//方法二:String str2 = reverse2(str);System.out.println(str2);System.out.println("---------------");//方法三:String str3 = reverse3(str);System.out.println(str3);System.out.println("---------------");}//方法1:public static String reverse1(String str){char[] cs = str.toCharArray();for(int i = 0,j = cs.length - 1;i < j;i++,j--){char temp = cs[i];cs[i] = cs[j];cs[j] = temp;}return new String(cs);}//方法二:public static String reverse2(String str){StringBuffer sb1 = new StringBuffer(str);sb1 = sb1.reverse();return sb1.toString();}//方法三:public static String reverse3(String str){StringBuffer sb = new StringBuffer();for(int i = str.length() - 1;i >= 0;i--){sb.append(str.charAt(i));}return sb.toString();}}4、给定一个单链表,和一个分组数K,每K个结点进行反转,如果最后的结点数不足K个就保持原来的链接顺序不变。
For example,
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
解题思路
用一个指针记录链接好的链表的最后一个结点(tail),用一个指针记录上一次链接好的部分的最后一个结点(head)对未链表的结点在head处进行尾插法,插k个元素,再将head移动到tail处,tail重新记录链表的尾结点,直到所有的元素都进行了操作。如果最后的一组元素不足k个,因为进行过尾插法,所以还要进行还原,对最后的head元素进行尾插法就可以了 。
结点类:
public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}
算法实现类:
public class Solution { public ListNode reverseKGroup(ListNode head, int k) { if (k <= 1) { return head; } ListNode root = new ListNode(0); // 分组的头一个元素的前驱 ListNode groupHead = root; // 当前要处理的结点 ListNode curr = head; // 处理好的链表的尾结点 ListNode groupTail = head; // 当前要处理的结点的后继 ListNode next; // 对每个组,处理了多少个结点 int count = 0; while (curr != null) { // 如果是分组的第一个元素就记录它 if (count == 0) { groupTail = curr; } // 记录处理的元素个数 count++; // 记录下一个待处理结点 next = curr.next; // 进行尾插法操作 curr.next = groupHead.next; groupHead.next = curr; curr = next; // 已经处理完了k个结点,分组头的前驱移动到最后一个链接好的结点 if (count == k) { groupHead = groupTail; // 计数器归零 count = 0; } } // 说明结点个数不是k的整数倍,将最后不是整数倍的个元素的结点, // 再次使用尾插法进行还原 if (count != 0) { curr = groupHead.next; groupHead.next = null; while (curr != null) { next = curr.next; curr.next = groupHead.next; groupHead.next = curr; curr = next; } } return root.next; }}
6.输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.
句子中单词以空格隔开,如将"I am a student"转为"student a am I"@Testpublic void test6(){String into = "I am a student !"; System.out.println(reverse(into)); }public static String reverse(String into){ String[] split = into.split(" ");//对输入的字符串进行分割,返回一个数组 StringBuilder sb = new StringBuilder();//由于单线程,StringBuilder效率较高,用于不断地添加字符串 for(int i = split.length-1; i>=0; i--){ if(i == 0){ sb.append(split[i]);//若已是最后一个单词,则不添加空格 }else{ sb.append(split[i]+" "); } } return sb.toString();//返回一个字符串 }
参考文献:http://blog.csdn.net/derrantcm/article/details/47034983
阅读全文
0 1
- Java链表及字符串反转问题集
- java面试笔试题,字符串反转问题
- java字符串操作:如何实现字符串的反转及替换?
- 字符串反转系列问题
- 字符串反转问题
- 字符串反转系列问题
- 字符串反转问题
- 字符串反转问题
- c++ 字符串反转问题
- 字符串反转问题总结
- day4_字符串反转问题
- 字符串反转问题
- java如何实现字符串的反转及替换
- java 反转字符串
- Java技巧:字符串反转
- Java 输出反转字符串
- 字符串反转-java
- java实现字符串反转
- wx.onMenuShareTimeline使用注意事项
- 1.2Java基础语法(关键字、标识符、注释、常量、变量...)
- oracle使用命令exp导出时,不能将表导出的解决办法
- Android中自定义圆形图片(二)
- 机器学习第六讲-逻辑回归
- Java链表及字符串反转问题集
- raid5_cache.c数据结构之r5l_io_unit
- Netty5.0+ 心跳机制(四)
- Item属性
- 09 redis集群的搭建 以及遇到的问题
- office图标显示异常和新建时图标没有显示等问题解决
- spark2.0-scala2.11.8-hadoop2.8.0配置
- 124. Binary Tree Maximum Path Sum&145.Binary Tree Postorder Traversal
- OpenGL蓝宝书源码学习(十七)第六章——DiffuseLight.cpp