如下:
public interface IList {
//头插法
public void addFirst(int data);
//尾插法
public void addLast(int data);
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data);
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key);
//删除第一次出现关键字为key的节点
public void remove(int key);
//删除所有值为key的节点
public void removeAllKey(int key);
//得到单链表的长度
public int size();
//清空单链表
public void clear();
//打印单链表
public void display();
}
public class SingleLinkedList implements IList{
@Override
public void addFirst(int data) {}
@Override
public void addLast(int data) {}
@Override
public void addIndex(int index, int data) {}
@Override
public boolean contains(int key) {
return false;
}
@Override
public void remove(int key) {}
@Override
public void removeAllKey(int key) {}
@Override
public int size() {
return usedsize;
}
@Override
public void clear() {}
@Override
public void display() {}
}
单链表是由一个个节点构成的:
因此需要在SingleLinkedList类中添加一个ListNode内部类,该类有两个成员变量:
分别是int类型的val和ListNode类型的next。同时也需要定义一个int类型的usedsize来记录节点的个数和定义ListNode类型的head来存放头节点的地址。
private int usedsize;
private LinkedNode head;
static class LinkedNode{
private int value;
LinkedNode next;
public LinkedNode(int value){
this.value = value;
}
}
1,得到单链表的长度
已经定义了usedsize来记录节点的个数,故usedsize的值就是单链表的长度。
public int size() {
return usedsize;
}
public void addFirst(int data) {
LinkedNodea = new LinkedNode(data);
a.next = head;
head = a;
usedsize++;
}
3,尾插法
当节点个数为零时,直接让head 指向要插入的节点。否则要想在链表的尾部插入,就必须找到最后一个节点的位置,因此需要定义cur = head,当cur不等于Null时让cur = cur.next,这样cur最后就是最后一个节点。
public void addLast(int data) {
LinkedNodea = new LinkedNode(data);
if (head == null)
head = a;
else {
LinkedNode cur = head;
while (cur.next != null){
cur = cur.next;
}
cur.next = a;
usedsize++;
}
}
4,任意位置插入,第一个数据节点为0号下标
当index为0和usedsize时,分别调用头插法和尾插法,否则如下:
public void addIndex(int index, int data) {
if (index == 0)
addFirst(data);
else if (index == size())
addLast(data);
else{
LinkedNode a = new LinkedNode(data);
LinkedNode cur = head;
for (int i = 0; i < index-1; i++) {
cur = cur.next;
}
a.next = cur.next;
cur.next = a;
usedsize++;
}
}
5,查找是否包含关键字key是否在单链表当中
只需定义cur = head,然后遍历链表即可。
public boolean contains(int key) {
LinkedNode cur = head;
while (cur != null){
if (cur.value == key){
return true;
}
cur = cur.next;
}
return false;
}
6,删除第一次出现关键字为key的节点
当key为第一个节点时,只需让head = head.next即可。否则:
public void remove(int key) {
if (head.value == key){
head = head.next;
usedsize--;
}else {
LinkedNode cur =head;
while (cur.next != null){
if (cur.next.value == key){
cur.next = cur.next.next;
usedsize--;
return;
}
}
}
}
7,删除所有值为key的节点
和删除一个key的操作基本相同。
public void removeAllKey(int key) {
LinkedNode cur = head;
while (cur.next != null){
if (cur.next.value != key){
cur = cur.next;
}else {
cur.next = cur.next.next;
usedsize--;
}
}
if (head.value == key){
head = head.next;
usedsize--;
}
}
8,清空单链表
public void clear() {
LinkedNode cur=head;
while(cur!=null){
LinkedNode curNext = cur.next;
cur.next = null;
cur = curNext;
}
head = null;
}
9,,打印单链表
public void display() {
LinkedNode cur = head;
for (int i = 0; i < size(); i++) {
System.out.print(cur.value + " ");
cur = cur.next;
}
System.out.println();
}
public class SingleLinkedList implements IList {
private int usedsize;
static class LinkedNode {
private int value;
LinkedNode next;
public LinkedNode(int value) {
this.value = value;
}
}
private LinkedNode head;
@Override
public void addFirst(int data) {
LinkedNode a = new LinkedNode(data);
a.next = head;
head = a;
usedsize++;
}
@Override
public void addLast(int data) {
LinkedNode a = new LinkedNode(data);
if (head == null)
head = a;
else {
LinkedNode cur = head;
while (cur.next != null) {
cur = cur.next;
}
cur.next = a;
usedsize++;
}
}
@Override
public void addIndex(int index, int data) {
if (index == 0)
addFirst(data);
else if (index == size())
addLast(data);
else {
LinkedNode a = new LinkedNode(data);
LinkedNode cur = head;
for (int i = 0; i < index - 1; i++) {
cur = cur.next;
}
a.next = cur.next;
cur.next = a;
usedsize++;
}
}
@Override
public boolean contains(int key) {
LinkedNode cur = head;
while (cur != null){
if (cur.value == key){
return true;
}
cur = cur.next;
}
return false;
}
@Override
public void remove(int key) {
if (head.value == key){
head = head.next;
usedsize--;
}else {
LinkedNode cur =head;
while (cur.next != null){
if (cur.next.value == key){
cur.next = cur.next.next;
usedsize--;
return;
}
}
}
}
@Override
public void removeAllKey(int key) {
LinkedNode cur = head;
while (cur.next != null){
if (cur.next.value != key){
cur = cur.next;
}else {
cur.next = cur.next.next;
usedsize--;
}
}
if (head.value == key){
head = head.next;
usedsize--;
}
}
@Override
public int size() {
return usedsize;
}
@Override
public void clear() {
LinkedNode cur=head;
while(cur!=null){
LinkedNode curNext = cur.next;
cur.next = null;
cur = curNext;
}
head = null;
}
@Override
public void display() {
LinkedNode cur = head;
for (int i = 0; i < size(); i++) {
System.out.print(cur.value + " ");
cur = cur.next;
}
System.out.println();
}
}