您的位置:首页 > 其它

链式顺序表-单链表的实现-------包括(单链表反转的两种方法)

2014-09-17 14:46 477 查看
1、=号表示赋值运算。
        点运算符的功能有两个:一是引用类中成员,二是指示包的层次等级。 
2、在链表的中间插入节点时应注意。先将新节点的Next域指向下一个节点,再见前一个节点的next域指向新节点。
P→Y  中间插入N              N.next=p.next     p.next=N
3、迭代法逆转:设置3个节点,P0→head;P1→P0.next;P2→P1.next;P3→P2.next;每次判断P3是否为空,若不为空,然后逆转P1,P2;逆转后赋新值。
P3相当于一个寄存器,存储逆转节点的下一个节点,逆转执行后,将此值迭代。
跟简单地说,假设单链表有n个节点,将第一个节点指向空。将第二个节点指向第一个节点,当第三个节点不为空→迭代:将第二个节点的值赋给第一个节点,将第三个节点的值赋给第二个节点,然后再逆转。
或者更轻松的说:假设n个节点,将第一个节点指向空,第二个节点指向第一个节点,第三个节点指向第二个节点...........
4、递归逆转:假设有n个节点,将n个节点先取出来,两两一组(p1,p2;p2,p3........),入栈;然后出栈,从后向前开始逆转Pn.next→Pn-1 、 Pn-1→null;.........
return返回的最后一个值是 原链表的head节点。此时没有头结点。所以我又写了一个setHead()的方法
核心代码:
package com.ibm.jzy.linkedList;
class Node{
Object data;
Node next;
Node(Object data){
this.data=data;
this.next=null;
}
Node(){}
}
public class LinkedList implements ILinkedList{
private Node head=new Node();
public LinkedList(){
head=new Node(null);
head.next=null;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
boolean result=false;
if(head.next==null)result=true;
else result=false;
return result;
}
@Override
public void insert(int position,Object data) {
if(position<1)System.out.println("插入位置异常!");
else{
Node temp=head;
int count=1;
while(temp!=null){
if(count==position){
Node newNode=new Node(data);
newNode.next=temp.next;
temp.next=newNode;
break;
}
temp=temp.next;
count++;
}
if(temp==null)System.out.println("插入位置异常!");
}
}
@Override
public void remove(int position) {
// TODO Auto-generated method stub
if(position<1)System.out.println("删除位置异常!");
else{
Node temp=head;
int count=1;
while(temp!=null){
if(count==position){
temp.next=temp.next.next;
break;
}else{
temp=temp.next;
count++;
}
}
}
}
@Override
public Object getData(int position) {
// TODO Auto-generated method stub
Object result=null;
if(position<1)System.out.print("查询位置异常:");
else{
Node temp=head;
int count=1;
int flag=0;
while(temp.next!=null){
temp=temp.next;
if(count==position){
result=temp.data;
flag=1;
break;
}
count++;
}
if(flag==0){
System.out.print("查询位置异常:");
}
}
return result;
}
@Override
public void add(Object data){//尾部插入法实现单链表
// TODO Auto-generated method stub
Node temp=head;
while(temp.next!=null)temp=temp.next;
Node newNode=new Node(data);
temp.next=newNode;
}
@Override
public int getLength() {
// TODO Auto-generated method stub
int count=0;
Node temp=head;
while(temp.next!=null){
count++;
temp=temp.next;
}
return count;
}
@Override
public void reverse() {
// TODO Auto-generated method stub
//迭代方法逆转
if(head.next==null){
return;
}
Node p0=head;
Node p1=p0.next;
Node p2=p1.next;
Node p3=p2.next;
p1.next=null;
while(p3!=null){
p2.next=p1;
p1=p2;
p2=p3;
p3=p3.next;
}
p2.next=p1;
head.next=p2;
}
@Override
public Node reverseRecursion(Node head) {
//递归逆转
if(head==null||head.next==null){
return head;
}
Node p1=head;
Node p2=p1.next;
head=reverseRecursion(p2);
p2.next=p1;
p1.next=null;
return head;
}
@Override
public Node getHead() {
// TODO Auto-generated method stub
return head;
}
@Override
public void setHead(Node head) {
//for 递归逆转
// TODO Auto-generated method stub
this.head.next=head;
}

}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: