由于java中没有结构体,所以用一个类来定义链表,代码如下
主要包括一个data,还有一个指向后面一个节点的next
重写了toString函数,返回你想要的数据
定义链表的类:
public class LinkNode { private String data; public LinkNode next; public String getData() { return data; } public void setData(String data) { this.data = data; } public LinkNode getNext() { return next; } public void setNext(LinkNode next) { this.next = next; } public LinkNode(String data, LinkNode next) { super(); this.data = data; this.next = next; } public LinkNode() { super(); } @Override public String toString() { return "LinkNode{" + "data='" + data + '\'' + ", next=" + next + '}'; } |
1.初始化链表:
public static void initLinkNode(LinkNode linkNode) { linkNode.setData("#"); linkNode.setNext(null); } |
2.遍历链表,返回链表的长度
public static int traverse(LinkNode linkNode) { LinkNode p = linkNode; int count = 1; while (p.next != null) { p = p.next; count++; } return count; } |
3.把链表L的data转化为StringBuffer输出,输出结果为字符串
public static StringBuffer outputLinkNode(LinkNode L) { StringBuffer str = new StringBuffer(); LinkNode p = L; for (@SuppressWarnings("unused") int i = 0; ; ) { str.append(p.data); if (p.next != null) { p = p.next; } else { break; } } return str; } |
4.在链表L的尾部插入一个节点,值为data
public static void insertLinkNode(LinkNode linkNode, String data) { LinkNode p = linkNode; for (int i = 0; ; ) { if (null == linkNode.next) { LinkNode q = new LinkNode(); q.setData(data); q.setNext(null); linkNode.setNext(q); break; } else { linkNode = linkNode.next; } } } |
5.删除第n个节点(从0开始)
public static void deleteLinkNode(LinkNode linkNode, Integer index) { LinkNode p = linkNode; int count = 1; while (true) { if (count == index) { p.setNext(p.next.next); break; } count++; p = p.next; } } |
6.返回最后一次出现data的节点位置index
public static int getIndex(LinkNode linkNode, String data) { LinkNode p = linkNode; int flag = 0; for (int i = 0; i < traverse(linkNode); i++) { if (p.data == data) { // System.out.println(i); flag = i; } p = p.next; } return flag; } |
测试程序:
public static void main(String[] args) { LinkNode linkNode = new LinkNode(); initLinkNode(linkNode); System.out.println(linkNode.toString()); System.out.println("插入节点"); insertLinkNode(linkNode, "R"); insertLinkNode(linkNode, "R"); insertLinkNode(linkNode, "L"); insertLinkNode(linkNode, "L"); insertLinkNode(linkNode, "R"); insertLinkNode(linkNode, "L"); System.out.println(linkNode.toString()); int count = traverse(linkNode); System.out.println("节点个数" + count); int lastIndex = getIndex(linkNode,"R"); System.out.println("最后一个R位置" + lastIndex); int index=2; System.out.println("删除位置:"+index+"的节点"); deleteLinkNode(linkNode,index); count =traverse(linkNode); System.out.println("节点个数"+count); StringBuffer str =outputLinkNode(linkNode); System.out.println(str); System.out.println(linkNode.toString()); } |
结果如下:
LinkNode{data='#', next=null} 插入节点 LinkNode{data='#', next=LinkNode{data='R', next=LinkNode{data='R', next=LinkNode{data='L', next=LinkNode{data='L', next=LinkNode{data='R', next=LinkNode{data='L', next=null}}}}}}} 节点个数7 最后一个R位置5 删除位置:2的节点 节点个数6 #RLLRL LinkNode{data='#', next=LinkNode{data='R', next=LinkNode{data='L', next=LinkNode{data='L', next=LinkNode{data='R', next=LinkNode{data='L', next=null}}}}}} |