链式顺序表-单链表的实现-------包括(单链表反转的两种方法)
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; } }
相关文章推荐
- 链表反转的两种实现方法
- 线性表的两种实现方式—— 顺序表及单链表的实现 ps:图片放大方法在见评论第一楼
- 链表反转的两种实现方法
- 链表反转的两种实现方法
- 递归求集合子集(两种方法实现(数组,链表))
- Java单链表顺序和链式实现(数据结构五)
- 学习笔记之约瑟夫环的两种实现方法(数组&链表)
- 遍历一次实现单链表顺序反转
- 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值
- js实现字符串反转的两种方法
- 链表的两种实现方法
- JAVA实现两种方法反转单列表
- C语言:链表的逆序,两种思考方法,第一种用rev_1()实现,第二种用rev_2( )实现.
- C语言两种方法实现字符串反转
- 栈的两种实现方法--数组实现与链式实现
- 剑指offer_面试题16_反转链表(两种方法)
- Java单链表顺序和链式实现(数据结构五)
- 数据结构队列的java实现,包括线性和链式两种方式
- java队列实现方法(顺序队列,链式队列,循环队列)
- 【转】JAVA实现两种方法反转单链表