难度:二星
如何逆置一个单链表存储起来的 字符串?
实现的方法有很多,这里我描述的是一个通过迭代和指针向后移动,翻转当前指针指向的方式来 实现的。看完这句话,我相信你也一定么有看懂,我一直觉得学数据结构和算法这门课,想通过文字来明白其中的原理是非常困难的。因为毕竟数据结构还是有很强的空间感的,尤其是指针指来指去的很可能就绕进去了,所以画图递进步骤是我觉得的一个好办法。这里其实我是先写出了代码并测试通过后,才画的图。而在学习《判断单链表存储的字符串是否为“回文串”》这篇的时候,我是先画图然后才写出的代码。 那到底是应该先把图画出来明白其中实现过程再写代码?还是先把代码试着写出来再画图来印证代码呢? 你可以给我留言说出你的看法,你平时是怎么学这算法的?
话不多说,先把代码贴上来。
package com.coding.studiodemo.linklist;
/**
* 逆置单链表
* 比如:abcde-->edcba
*/
public class ReverseLinkList {
public static void reverseLinkList(LinkNode head){
LinkNode prev = null;
LinkNode cur = head;
LinkNode next = head.getNext();
while(next!=null){
cur.setNext(prev);
prev = cur;
cur = next;
next = next.getNext();
}
if (next==null){
cur.setNext(prev);
}
while(cur!=null){
System.out.print(cur);
cur = cur.getNext();
}
}
public static void main(String[] args) {
LinkNode a = new LinkNode("a") ;
LinkNode b = new LinkNode("b") ;
LinkNode c = new LinkNode("c") ;
LinkNode d = new LinkNode("d") ;
LinkNode e = new LinkNode("e") ;
a.setNext(b);
b.setNext(c);
c.setNext(d);
d.setNext(e);
reverseLinkList(a);
}
}
package com.coding.studiodemo.linklist;
/**
* 定义单链表的节点
* @author jeffSheng
*/
public class LinkNode {
private String val;
private LinkNode next;
public LinkNode(String data){
this.val = data;
}
public String getData() {
return val;
}
public LinkNode getNext() {
return next;
}
public void setNext(LinkNode next) {
this.next = next;
}
@Override
public String toString() {
return "["+val+"]";
}
}
代码看起来很简单,这里我用一幅图来把代码的实现过程写出来。
不知你看明白了没?