JAVA写一个单链表
1、已知带头结点的动态单链表 L 中的结点是按整数值递增排序的,试写一 算法将值为 x 的结点插入到表 L 中,使 L 仍然有序。要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
2、设计一算法,逆置带头结点的动态链表 L。要求利用原表的结点空间, 并要求用尽可能少的时间完成。
3、假设有两个按元素值递增有序的线性表 A 和 B,均以单链表作存储结构, 试编写算法将 A 表和 B 表归并成一个按元素值递减有序的线性表性表 C,并要求 利用原表的空间存放 C,并要求用尽可能少的时间完成。
如何插入一段漂亮的代码片
- 要求一:不破坏表的顺序插入元素,时间复杂度O(n)
一个for循环即可解决
//
public void Insert_order(int e){
Node current = header;
if(header == null) //空表直接尾部加
add(e);//在尾部添加元素
int i;
for(i=0;i<size&¤t!=null;i++,current=current.next){
if(current.data>=e){
//如果某个结点的指大于等于输入值
if(i==0) {
//如果是在头节点,直接加在前面
addHead_e(e);//在头部添加元素
break;
}
Node p=this.getNodeByIndex(i-1);//指定位置的前一个节点
p.next=new Node(e,p.next);//这是不在首位的情况,获取当前节点的前一个节点并将e插在它后面,同时新节点的指向是原节点的下一个节点
size++;
break;
}
}
if(i==size)//如果循环没有被break结束,那么i的值与size的值相等,
add(e);//这说明这个元素比原链表中任何一个都大,直接在尾部添加节点即可
//System.out.println(size);
}
用到的add(e)和addHead_e(e)方法:
//直接在尾部插入元素
public void add(int e){
if(header==null) {
header = new Node(e, null);
tail = header;
}
else{
Node p=new Node(e,null);
tail.next=p;
tail=p;
}
size++;
}
//在表头插入元素
public void addHead_e(int e){
Node p=new Node(e,null);
p.next=header;
header=p;
if(header.next==null)
tail=header;
size ++;
}
用到的getNodeByIndex(index)方法:
// 获取指定节点
private Node getNodeByIndex(int index){
if(index < 0 || index >= size)
throw new IndexOutOfBoundsException("索引超出线性表范围");
Node current = header;//从header开始遍历
for(int i=0; i<size && current!=null; i++,current=current.next){
if(i == index)
return current;
}
return null;
}
- 要求2:逆置带头结点的动态单链表 L
一共有三种方法,这里选择的是迭代法
事实上这里可以不需要返回值的,截至到header=p就可以了
具体结合实际应用
//逆置(迭代法)
/*
1.先将当前节点的下一节点记录下来,
2.然后将当前节点指向上一节点
3.再将当前节点记录下来,让记录的下一节点变成当前节点
* */
public Node ReverseLink1(){