1.add方法
public class Node {
Node previous;//上一个节点
Node next;//下一个节点
Object elements;//元素数据
public Node(Node previous, Node last, Object elements) {
this.previous = previous;
this.next = next;
this.elements = elements;
}
public Node(Object elements) {
this.elements = elements;
}
}
public class SxtLinkedList01 {
private Node first;//第一个节点
private Node last;//最后一个节点
private int size;//节点数
//[]
//["a","b","c"]
public void add(Object obj){
Node node=new Node(obj);
if(first==null){
first=node;
last=node;
}else{
node.previous=last;
node.next=null;
last.next=node;
last=node;
}
}
//重写 toString 方法
public String toString() {
StringBuilder sb=new StringBuilder("[");
Node temp =first;
while(temp!=null){
sb.append(temp.elements+",");
temp=temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
SxtLinkedList01 list= new SxtLinkedList01();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
}
}
[a,b,c]
2.get方法
public class SxtLinkedList01 {
private Node first;//第一个节点
private Node last;//最后一个节点
private int size;//节点数
public Object get(int index){
if(index<0||index>size-1){
throw new RuntimeException("索引数字不合法:"+index);
}
Node temp=null;
if(index<=(size>>1)){//如果get的索引值小于size的一半,从前往后遍历到一半
temp=first;
for(int i=0;i<index;i++){
temp=temp.next;
}
}else{//从后往前遍历到一半
temp=last;
for(int i=size-1;i>index;i--){
temp=temp.previous;
}
}
return temp.elements;
}
//[]
//["a","b","c"]
public void add(Object obj){
Node node=new Node(obj);
if(first==null){
first=node;
last=node;
}else{
node.previous=last;
node.next=null;
last.next=node;
last=node;
}
size++;//每增加一个元素,size要加一
}
//重写 toString 方法
public String toString() {
StringBuilder sb=new StringBuilder("[");
Node temp =first;
while(temp!=null){
sb.append(temp.elements+",");
temp=temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
SxtLinkedList01 list= new SxtLinkedList01();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.get(2));
}
}
3.remove方法
public class SxtLinkedList01 {
private Node first;//第一个节点
private Node last;//最后一个节点
private int size;//节点数
public void remove(int index){
Node temp =getNode(index);
//移除元素不为空时
if(temp!=null){
Node up=temp.previous;
Node down=temp.next;
//前一个元素不为空时:
if(up!=null){
up.next=down;
}
//后一个元素不为空时:
if(down!=null){
down.previous=up;
}
//移除的是第一个元素时,直接将第二个元素置为第一个
if(index==0){
first=down;
}
//移除的是最后一个元素时,直接将倒数第二个元素置为最后一个
if(index==size-1){
last=up;
}
size--;
}
}
public Object get(int index){
if(index<0||index>size-1){
throw new RuntimeException("索引数字不合法:"+index);
}
Node temp =getNode(index);
return temp!=null?temp.elements:null;
}
public Node getNode(int index){
Node temp=null;
if(index<=(size>>1)){
temp=first;
for(int i=0;i<index;i++){
temp=temp.next;
}
}else{
temp=last;
for(int i=size-1;i>index;i--){
temp=temp.previous;
}
}
return temp;
}
//[]
//["a","b","c"]
public void add(Object obj){
Node node=new Node(obj);
if(first==null){
first=node;
last=node;
}else{
node.previous=last;
node.next=null;
last.next=node;
last=node;
}
size++;
}
//重写 toString 方法
public String toString() {
StringBuilder sb=new StringBuilder("[");
Node temp =first;
while(temp!=null){
sb.append(temp.elements+",");
temp=temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
SxtLinkedList01 list= new SxtLinkedList01();
list.add("a");
list.add("b");
list.add("c");
list.add("e");
list.add("f");
list.add("g");
System.out.println(list);
list.remove(0);
System.out.println(list);
list.remove(3);
System.out.println(list);
}
}
4. add插入元素
public class SxtLinkedList01 {
private Node first;//第一个节点
private Node last;//最后一个节点
private int size;//节点数
public void add(int index,Object obj){
Node newNode=new Node(obj);
Node temp=getNode(index);
//插入元素不为空
if(temp!=null){
Node up=temp.previous;
Node down=temp.next;
//指定索引位置前一个不为空时,即索引值不为0
if(up!=null){
up.next= newNode;
newNode.previous=up;
newNode.next=temp;
temp.previous=newNode;
}else{//当索引值为0时
down.previous=newNode;
newNode.next=down;
newNode.previous=temp;
temp.next=newNode;
}
}
}
public void remove(int index){
Node temp =getNode(index);
//移除元素不为空时
if(temp!=null){
Node up=temp.previous;
Node down=temp.next;
//前一个元素不为空时:
if(up!=null){
up.next=down;
}
//后一个元素不为空时:
if(down!=null){
down.previous=up;
}
//移除的是第一个元素时,直接将第二个元素置为第一个
if(index==0){
first=down;
}
//移除的是最后一个元素时,直接将倒数第二个元素置为最后一个
if(index==size-1){
last=up;
}
size--;
}
}
public Object get(int index){
if(index<0||index>size-1){
throw new RuntimeException("索引数字不合法:"+index);
}
Node temp =getNode(index);
return temp!=null?temp.elements:null;
}
public Node getNode(int index){
Node temp=null;
if(index<=(size>>1)){
temp=first;
for(int i=0;i<index;i++){
temp=temp.next;
}
}else{
temp=last;
for(int i=size-1;i>index;i--){
temp=temp.previous;
}
}
return temp;
}
//[]
//["a","b","c"]
public void add(Object obj){
Node node=new Node(obj);
if(first==null){
first=node;
last=node;
}else{
node.previous=last;
node.next=null;
last.next=node;
last=node;
}
size++;
}
//重写 toString 方法
public String toString() {
StringBuilder sb=new StringBuilder("[");
Node temp =first;
while(temp!=null){
sb.append(temp.elements+",");
temp=temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
SxtLinkedList01 list= new SxtLinkedList01();
list.add("a");
list.add("b");
list.add("c");
list.add("e");
list.add("f");
list.add("g");
System.out.println(list);
list.add(0,"小王");//[a,b,c,e,f,g]
System.out.println(list);//[a,小王,b,c,e,f,g]
}
}
5.增加泛型
public class SxtLinkedList01<E> {
private Node first;//第一个节点
private Node last;//最后一个节点
private int size;//节点数
public void add(int index,E element){
checkRange(index);
Node newNode=new Node(element);
Node temp=getNode(index);
//插入元素不为空
if(temp!=null){
Node up=temp.previous;
Node down=temp.next;
//指定索引位置前一个不为空时,即索引值不为0
if(up!=null){
up.next= newNode;
newNode.previous=up;
newNode.next=temp;
temp.previous=newNode;
}else{//当索引值为0时
down.previous=newNode;
newNode.next=down;
newNode.previous=temp;
temp.next=newNode;
}
}
}
public void remove(int index){
checkRange(index);
Node temp =getNode(index);
//移除元素不为空时
if(temp!=null){
Node up=temp.previous;
Node down=temp.next;
//前一个元素不为空时:
if(up!=null){
up.next=down;
}
//后一个元素不为空时:
if(down!=null){
down.previous=up;
}
//移除的是第一个元素时,直接将第二个元素置为第一个
if(index==0){
first=down;
}
//移除的是最后一个元素时,直接将倒数第二个元素置为最后一个
if(index==size-1){
last=up;
}
size--;
}
}
public E get(int index){
checkRange(index);
Node temp =getNode(index);
return temp!=null?(E)temp.elements:null;
}
private void checkRange(int index){
if(index<0||index>size-1){
throw new RuntimeException("索引数字不合法:"+index);
}
}
private Node getNode(int index){
checkRange(index);
Node temp=null;
if(index<=(size>>1)){
temp=first;
for(int i=0;i<index;i++){
temp=temp.next;
}
}else{
temp=last;
for(int i=size-1;i>index;i--){
temp=temp.previous;
}
}
return temp;
}
//[]
//["a","b","c"]
public void add(E element){
Node node=new Node(element);
if(first==null){
first=node;
last=node;
}else{
node.previous=last;
node.next=null;
last.next=node;
last=node;
}
size++;
}
//重写 toString 方法
public String toString() {
StringBuilder sb=new StringBuilder("[");
Node temp =first;
while(temp!=null){
sb.append(temp.elements+",");
temp=temp.next;
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
SxtLinkedList01<String> list= new SxtLinkedList01();
list.add("a");
list.add("b");
list.add("c");
list.add("e");
list.add("f");
list.add("g");
System.out.println(list);
list.add(0,"小王");//[a,b,c,e,f,g]
System.out.println(list);//[a,小王,b,c,e,f,g]
System.out.println(list.get(2));
}
}