Danh sách liên kết đơn

Một phần của tài liệu Bài giảng Lập trình hướng đối tượng: Phần 1 (Trang 102 - 108)

Định nghĩa một nút của danh sách liên kết đơn

Một nút của danh sách liên kết đơn bao gồm:

Giá trị của nút, có dạng là một đối tượng kiểu Node đã được định nghĩa trong chương trình 5.2a

Nút tiếp theo của nút đó.

Một nút của danh sách liên kết đơn được cài đặt trong chương trình 5.4a.

Chương trình 5.4a

package vidu.chuong5; public class SimpleNode{

private Node value; // Giá trị của node là một đối tượng kiểu Node private SimpleNode next; // Node tiếp theo của danh sách liên kết

/* Các phương thức khởi dựng */ public SimpleNode(){

value = new Node(); next = null;

}

103

this.value = value; next = null; }

/* Phương thức truy nhập thuộc tính value */ public Node getValue(){

return value; }

public void setValue(Node value){ this.value = value;

}

/* Phương thức truy nhập thuộc tính next */ public SimpleNode getNext(){

return next; }

public void setNext(SimpleNode next){ this.next = next;

} }

Định nghĩa đỉnh tiêu đề của danh sách liên kết đơn

Đỉnh tiêu đề của danh sách liên kết đơn là một đối tượng khác với một nút thông thường của danh sách. Đối tượng này lưu các thông tin:

Chỉ đến nút thực sự đầu tiên của danh sách Chỉ đến nút cuối cùng của danh sách Lưu giữ số lượng nút thực sự trong danh sách.

Chương trình 5.4b cài đặt lớp đỉnh tiêu đề của danh sách.

Chương trình 5.4b

package vidu.chuong5;

public class HeaderSimpleNode{ private int nodeNumber; private SimpleNode header; private SimpleNode tailer;

104 /* Phương thức khởi dựng */ public HeaderSimpleNode(){ nodeNumber = 0; header = null; tailer = null; }

/* Phương thức truy nhập thuộc tính nodeNumber */ public int getNodeNumber(){

return nodeNumber; } (adsbygoogle = window.adsbygoogle || []).push({});

public void setNodeNumber(int nodeNumber){ this.nodeNumber = nodeNumber;

}

/* Phương thức truy nhập thuộc tính header */ public SimpleNode getHeader(){

return header; }

public void setHeader(SimpleNode header){ this.header = header;

}

/* Phương thức truy nhập thuộc tính tailer */ public SimpleNode getTailer(){

return tailer; }

public void setTailer(SimpleNode tailer){ this.tailer = tailer;

} }

Cài đặt danh sách liên kết đơn Danh sách liên kết đơn có thuộc tính cục bộ là một đối tượng kiểu HeaderSimpleNode. Và có các thao tác chính:

105

Thêm một phần tử vào một vị trí bất kì: nếu vị trí nhỏ hơn 0, thêm vào đầu danh sách. Nếu vị trí lớn hơn độ dài danh sách, thêm vào cuối. Trường hợp còn lại, chèn vào danh sách một cách bình thường.

Loại bỏ một phần tử ở vị trí bất kì: Chỉ loại bỏ khi vị trí chỉ ra nằm trong phạm vi độ dài danh sách. Phương thức này trả về nút bị loại bỏ, có kiểu SimpleNode.

Duyệt toàn bộ danh sách: Trả về giá trị của tất cả các phần tử có trong danh sách. Giá trị trả về là một mảng các phần tử giá trị có kiểu Node.

Chương trình 5.4c cài đặt lớp danh sách liên kết đơn.

Chương trình 5.4c

package vidu.chuong5; public class SimpleList{

private HeaderSimpleNode myList; /* Các phương thức khởi dựng */ public SimpleList(){

myList = new HeaderSimpleNode(); }

/* Phương thức chèn thêm một node vào vị trí @position */ public void insert(Node value, int position){

// Tạo một node mới

SimpleNode newNode = new SimpleNode(value); if(position <= 0){ // Chèn vào đầu

newNode.setNext(myList.getHeader()); myList.setHeader(newNode);

if(myList.getNodeNumber() == 0) // Danh sách ban đầu rỗng myList.setTailer(newNode);

}else if(position >= myList.getNodeNumber()){ // Chèn vào cuối if(myList.getNodeNumber() == 0){ // Danh sách ban đầu rỗng

myList.setHeader(newNode); myList.setTailer(newNode); }else{ // Danh sách không rỗng

myList.getTailer().setNext(newNode); myList.setTailer(newNode);

106

}else{ // Chèn vào giữa int index = 0; (adsbygoogle = window.adsbygoogle || []).push({});

SimpleNode prev = null;

SimpleNode current = myList.getHeader(); while(index < position){ index++; prev = current; current = current.getNext(); } newNode.setNext(current); prev.setNext(newNode); } myList.setNodeNumber(myList.getNodeNumber() + 1); }

@position */ public SimpleNode remove(int position){

if((myList.getNodeNumber() == 0)||

(position < 0)||(position >= myList.getNodeNumber())) return null;

SimpleNode result = null;

if(position == 0){ // Loại phần tử đầu result = myList.getHeader();

myList.setHeader(myList.getHeader().getNext()); if(myList.getNodeNumber() == 1) // Danh sách chỉ có 1 phần tử

myList.setTailer(null);

}else if(position==myList.getNodeNumber()-1){ // Loại phần tử cuối result = myList.getTailer();

SimpleNode current = myList.getHeader();

while(!current.getNext().equals(myList.getTailer())) current = current.getNext();

current.setNext(null); myList.setTailer(current);

107

int index = 0;

SimpleNode prev = null;

SimpleNode current = myList.getHeader(); while(index < position){ index++; prev = current; current = current.getNext(); } prev.setNext(current.getNext()); result = current; }

// Cập nhật số lượng node của danh sách

myList.setNodeNumber(myList.getNodeNumber() - 1);

result.setNext(null); return result;

}

/* Phương thức duyệt toàn bộ danh sách */ public Node[] travese(){

// Danh sách rỗng

if(myList.getNodeNumber() == 0) return null;

// Danh sách không rỗng Node[] result = new

Node[myList.getNodeNumber()]; SimpleNode current = myList.getHeader(); int index = 0; while(current != null){ result[index] = current.getValue(); index++; current = current.getNext(); } return result; } }

108

Một phần của tài liệu Bài giảng Lập trình hướng đối tượng: Phần 1 (Trang 102 - 108)