算法与数据结构【Java】:普通单向链表

普通单向链表应该包含的数据和方法:

结点类(Node):


    属性:
        AnyType value;    //任意类型的数据
        Node* next;        //指向下一个节点的指针
    方法:
        构造方法 Node(AnyType* value, Node* next);

链表类(LinkedList):


    Node* head;        //链表头结点的指针
    Node* tail;        //链表尾结点的指针,可选
    int length;        //链表长度,可选

    int isEmpty();    //链表是否为空
    int contains();    //链表是否包含某个值
    void addToHead(AnyType value);    //向链表头添加数据
    void addToTail(AnyType value);    //向链表尾添加数据
    void addNode(AnyType value, int index)    //向链表指定下标处添加数据
    int deleteFromHead();    //从链表头删除一个数据,返回被删除的数据
    int deleteFromTail();    //从链表尾删除一个数据,返回被删除的数据
    int deleteNode();    //删除指定下标处的数据,返回被删除的数据

 

实现每种方法的思路:


    1、因为LinkedList类的属性有:head,tail,length
        所以要根据不同情况更新三个属性
    2、所以每种方法,都要处理:
        1)head发生变化
        2)tail发生变化
        的情况

下方是Java代码:


//链表类
public class LinkedList {
	//
	Node head;	//链表头结点的指针
	Node tail;	//链表尾结点的指针,可选
	int length;	//链表长度,可选
	
	int isEmpty() {			//链表是否为空
		//头结点为空,链表为空
		return head == null ? 1 : 0;	
	};	
	
	int contains(int value) {		//链表是否包含某个值
		//遍历链表,查找值
		for (Node now=head; now!=null; now=now.next)
			if (now.value == value)
				return 1;
		return 0;
	}
	
	void addToHead(int value) {		//向链表头添加数据
		//如果链表为空,更新head和tail
		if (head == null) 
			head = tail = new Node(value);
		//否则直接添加
		else 
			this.head = new Node(value, this.head);
		this.length++;
	}
	
	void addToTail(int value) {		//向链表尾添加数据
		//如果链表为空,更新head和tail
		if (head == null)
			head = tail = new Node(value);
		//否则直接添加
		else 
			tail = tail.next = new Node(value);
		length++;
	}
	
	void addNode(int value, int index) {	//向链表指定下标处添加数据
		//如果要添加的下标不合法,直接返回
		if (index <= 0) return;
		//如果链表为空,且在第一个位置插入
		if (head == null && index == 1) {
			head = tail = new Node(value);
			length++;
			return ;
		}
		//如果链表为空,要在非法位置插入
		else if (head == null && index != 1) {
			return ;
		}
		//如果在头部插入,更新head
		if (index == 1) {
			head = new Node(value, head);
			length++;
			return ;
		}
		//在其他部位插入
		Node aheadOfAdd = null;
		int cnt = 1;
		//循环查找链表,找到index-1位置的结点,存入aheadOfAdd
		//使得循环停止的条件有两个:
			//情况1:aheadOfAdd=null单独成立,说明要添加的序号已经超出现有的链表长度
			//情况2:cnt+1=index成立且aheadOfAdd为空,说明要插入的位置刚好在链表尾向后第二个位置
			//情况3:cnt+1=index单独成立,说明找到了要插入的结点的前一个结点
		for (aheadOfAdd=head,cnt=1; aheadOfAdd!=null&&cnt+1

 

你可能感兴趣的:(算法与数据结构c++&Java,WilliamCode算法大师,Data,structure,java,算法与数据结构)