线性表的链式实现
用鏈式實現的線性表,公共接口ADT跟上一篇一樣
1,有序鏈表
成員變量和構造函數:
private int count;
public LinkedOrderedList()
{
front = null;
count = 0;
實現清單(將ADT和有序鏈表擴展的獨有操作分別作了注釋):
import Bag.LinearNode;
public class LinkedOrderedList implements ListADT {
private LinearNode front;
private int count;
public LinkedOrderedList()
{
front = null;
count = 0;
}
//三種鏈表的接口公共操作(實現是一樣的)
public int size() {
return count;
}
public boolean isEmpty() {
return (count == 0);
}
public Object first() {
if(size() == 0){
System.out.println("鏈表為空,沒有元素");
return null;
}
return front.getElement();
}
public Object last() {
if(size() == 0){
System.out.println("鏈表為空,沒有元素");
return null;
}
LinearNode last = front;//遍歷鏈表求last的代碼
for(int i = 0;i < count-1;i++)
last = last.getNext();
return last.getElement();
}
public Object removeFirst() {
if(size() == 0){
System.out.println("鏈表為空,沒有元素");
return null;
}
Object result = front.getElement();
front = front.getNext();
count--;
return result;
}
public Object removeLast() {
if(size() == 0){
System.out.println("鏈表為空,沒有元素");
return null;
}
LinearNode last = front;
for(int i = 0;i < count-1;i++)
last = last.getNext();
count--;//count-1自動刪除最后一個結點
return last.getElement();
}
public Object remove(Object element) {
Object result = null;
if(size() == 0){//如果為空
System.out.println("鏈表為空,沒有元素");
return null;
}
else if(front.getElement().equals(element)){//如果是鏈表的第一個元素
result = front.getElement();
front = front.getNext();
count--;
}
else{
LinearNode pre,current;
pre = front;
for(int i = 0;i < count-1;i++)
{
current = pre.getNext();
if(current.getElement().equals(element))
{
result = current.getElement();
pre.setNext(current.getNext());//如果current到了最后一個元素,getNext就是null
count--;
return result;
}
pre = pre.getNext();
}
}
return result;
}
public boolean contains(Object element) {
LinearNode temp = front;
for(int i = 0;i < count;i++){
if(temp.getElement().equals(element))
return true;
temp = temp.getNext();
}
return false;
}
//有序鏈表擴展的操作
public void add(Comparable element){
LinearNode node = new LinearNode(element);
LinearNode last = front;
for(int i = 1;i < count;i++)
last = last.getNext();
if(size() == 0){//鏈為空
front = node;
count++;
return;
}
else if(element.compareTo(front.getElement()) < 0){//插入在鏈首
node.setNext(front);
front = node;
count++;
return;
}
else if(element.compareTo(last.getElement()) > 0){//插入在鏈尾
last.setNext(node);
count++;
}
else{//插入在鏈中間
LinearNode current = front;
LinearNode next = current.getNext();
for(int i = 0;i < count-1;i++){
if(element.compareTo(next.getElement()) < 0){
current.setNext(node);
node.setNext(next);
count++;
return;
}
current = next;
next = next.getNext();
}
}
}
public static void main(String[] args) {
LinkedOrderedList list = new LinkedOrderedList();
System.out.println("將0到24打亂順序加入表,因為是有序表,它將自動排好序");
for(int i = 20;i < 25;i++)
list.add(i);
for(int i = 0;i < 10;i++)
list.add(i);
for(int i = 10;i < 20;i++)
list.add(i);
System.out.println("表的大小為: " + list.size());
System.out.println("表為空嗎?: " + list.isEmpty());
System.out.println("表的第一個元素為: " + list.first());
System.out.println("表的最后一個元素為: " + list.last());
System.out.println("\n刪除第一個元素");
list.removeFirst();
System.out.println("表的大小為: " + list.size());
System.out.println("表為空嗎?: " + list.isEmpty());
System.out.println("表的第一個元素為: " + list.first());
System.out.println("表的最后一個元素為: " + list.last());
System.out.println("\n再接著刪除最后一個元素");
list.removeLast();
System.out.println("表的大小為: " + list.size());
System.out.println("表為空嗎?: " + list.isEmpty());
System.out.println("表的第一個元素為: " + list.first());
System.out.println("表的最后一個元素為: " + list.last());
System.out.println("\n再接著刪除指定元素20,15,10,5");
list.remove(20);
list.remove(10);
list.remove(15);
list.remove(5);
list.remove(23);
System.out.println("表的大小為: " + list.size());
System.out.println("表為空嗎?: " + list.isEmpty());
System.out.println("表的第一個元素為: " + list.first());
System.out.println("表的最后一個元素為: " + list.last());
}
}
2,無序鏈表
成員變量,構造函數,公共操作完全一樣,擴展的操作:
public void addToFront(Object element){
LinearNode node = new LinearNode(element);
node.setNext(front);
front = node;
count++;
}
public void addToRear(Object element){
LinearNode last = front;
for(int i = 0;i < count-1;i++)
last = last.getNext();
LinearNode node = new LinearNode(element);
last.setNext(node);
count++;
}
public void addAfter(Object after,Object element){
LinearNode temp = front;
LinearNode elenode = new LinearNode(element);
for(int index = 0;index < count;index++){
if(temp.getElement().equals(after) && index != count-1)
{
elenode.setNext(temp.getNext());
temp.setNext(elenode);
count++;
return;
}
else if(temp.getElement().equals(after) && index == count-1)
{
LinearNode last = front;
for(int i = 0;i < count-1;i++)
last = last.getNext();
last.setNext(elenode);
count++;
return;
}
temp = temp.getNext();
}
}
3,索引鏈表
擴展的操作:
LinkedIndexedList //索引鏈表擴展的操作
public void add(Object element){//在表尾插入
if(size() == 0)
{
front = new LinearNode(element);
count++;
return;
}
LinearNode node = new LinearNode(element);
LinearNode last = front;
for(int i = 0;i < count-1;i++)
last = last.getNext();
last.setNext(node);
count++;
}
public void add(int index,Object element){
LinearNode node = new LinearNode(element);
if(index == 0)
{
node.setNext(front);
front = node;
count++;
}
else
{
LinearNode pre = front;
for(int i = 0;i < index-1;i++)
pre = pre.getNext();
LinearNode current = pre.getNext();
node.setNext(current);
pre.setNext(node);
count++;
}
}
public void set(int index,Object element){//設置某個索引上的元素(覆蓋原來的,不需要移動元素)
LinearNode node = new LinearNode(element);
LinearNode temp = front;
for(int i = 0;i < index;i++)
temp = temp.getNext();
temp.setElement(element);
}
public Object get(int index){//返回某個索引上的元素
LinearNode temp = front;
for(int i = 0;i < index;i++)
temp = temp.getNext();
return temp.getElement();
}
public int indexOf(Object element){//返回某個元素的索引
LinearNode temp = front;
for(int index = 0;index < count;index++){
if(element.equals(temp.getElement()))
return index;
temp = temp.getNext();
}
return -1;
}
public Object remove(int index){//移除指定索引上的元素
if(index == 0)
{
Object result = front.getElement();
front = front.getNext();
count--;
return result;
}
else if(index == count-1)
{
LinearNode last = front;
for(int i = 0;i < count;i++)
last = last.getNext();
Object result = last.getElement();
count--;
return result;
}
else
{
LinearNode pre = front;
for(int i = 0;i < index-1;i++)
pre = pre.getNext();
LinearNode current = pre.getNext();
Object result = current.getElement();
pre.setNext(current.getNext());
count--;
return result;
}
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
- 上一篇: 最近对kafka的移植工作
- 下一篇: 3G助推智慧医疗 看病将更加“智能化”