链表简介
代码实现
package com.chenxixuexi;
/**
* 泛型链表
* 单链表逆置数据--节点
* 求单链表倒数第K节点
* 求两个单链表 是否相交 相交交点
* 判断单链表是否有环?有求出环的入口点 求环的长度?
* 合并两个递增的单链表
* @author 14831
*
* @param <T>
*/
public class Link<T> {
private Entry<T> head = new Entry<T>();
/**
* 节点类
* @author 14831
*
* @param <T> 类型
*/
class Entry<T>{
T data;
Entry<T> next;
/**
* 头结点空构造方法
*/
public Entry() {
data = null;
next = null;
}
/**
* 构造节点
* @param a
*/
public Entry(T a) {
data = a;
next = null;
}
}
/**
* 头插法
* @param val 需要插入的数据
*/
public void insertHead(T val)
{
Entry<T> cur = new Entry<T>(val);
cur.next = head.next;
head.next = cur;
}
/**
* 尾插法
* @param val 需要插入的值
*/
public void insertTail(T val)
{
Entry<T> cur = head;
while(cur.next!= null)
{
cur = cur.next;
}
cur.next = new Entry<T>(val);
}
/**
* 插入到pos位置 从有数据开始为0下标
* @param pos 位置序号
* @param val 插入的值
*/
public void insertPos(int pos,T val)
{
Entry<T> cur = head;
int count = 0;
if(pos<0||pos>getLength())
System.out.println("下标"+pos+"不合法,自动插入到最后位置");
while(cur.next!= null)
{
if(count == pos)
break;
count++;
cur = cur.next;
}
Entry<T> cur1 = new Entry<T>(val);
cur1.next = cur.next;
cur.next = cur1;
}
/**
* 遍历输出数组
*/
public void show()
{
Entry<T> cur = head.next;
System.out.print("[");
while(cur!=null)
{
System.out.print(cur.data+" ");
cur = cur.next;
}
System.out.println("]");
}
/**
* 获得链表长度
* @return 链表长度
*/
public int getLength()
{ int count=0;
Entry<T> cur = head.next;
while(cur!=null)
{
count++;
cur = cur.next;
}
return count;
}
/**
* 翻转链表
*/
public void Reversal()
{
Entry<T> p = head.next,p1 = null,p2 = null;
while(p!=null){
p1 = p.next;
p.next = p2;
p2 = p;
p = p1;
}
head.next = p2;
}
/**
* 求倒数第K个元素
*
* @param k 序号
* @return 所求元素
*/
public T BackWardsToK(int k)
{
if(k>getLength()-1){
System.err.println("超越限制,下标不合法,倒数下标从0开始");
return null;
}
int key = getLength()-k;
Entry<T> cur = head;
int count = 0;
while(cur.next!= null)
{
if(count == key)
break;
count++;
cur = cur.next;
}
return cur.data;
}