链表是有序的列表。
小结:
1.链表是以节点的方式来存储
2.每个节点包含data域,next域:指向下一个节点
3.链表的各个节点不一定是连续存储
单向链表
head节点:
1.不存放具体数据
2.作用就是表示单链表头next
节点类:
//定义一个节点类
class Node{
int item;
Node next;//指向下一个节点
public Node(int item, Node next) {
super();
this.item = item;
this.next = next;
}
public Node(int item) {
super();
this.item = item;
}
public Node() {
super();
}
@Override
public String toString() {
return "Node [item=" + item + "]";
}
}
创建单向链表(添加):
1.先创建一个head头节点,作用就是表示单链表的头
//先创建一个头节点,不存放具体数据
Node head = new Node(0, null);
2.后面添加每一个节点,就直接加入到链表的最后
//向链表尾添加数据
public void add(Node newNode) {
if(head.next == null) {
head.next = newNode;
return;
}
Node temp = head;
while(temp.next != null) {//找到链表的最后
temp = temp.next;
}
temp.next = newNode;
}
遍历单项链表:
1.通过一个辅助指针遍历整个链表
//遍历
public void printList() {
Node temp = head.next;
while(temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
按照某个属性的顺序添加新的节点(newNode):
1.定义一个辅助指针(temp)指向新节点位置的前一个节点,找到新添加节点(newNode)的位置,定义boolean的flag默认值=false,如果找到false=true
2.newNode.next = temp.next;
3.temp.next = newNode;
//按照顺序添加数据
public void addByOrder(Node newNode) {
if(head.next == null) {
head.next = newNode;
return;
}
Node temp = head.next;
boolean flag = false;
while(true) {
if(temp.next != null) {
if(temp.next.item > newNode.item ) {
break;
}else if(temp.next.item == newNode.item){
flag = true;
}
}else {
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("已经存在不能添加");
}else {
if(temp.next == null) {
temp.next = newNode;
}else {
newNode.next = temp.next;
temp.next = newNode;
}
}
}
修改单向链表的某一节点(还需判断链表是否为空):
1.定义一个辅助指针(temp)指向需要修改的节点位置,定义boolean的flag默认值=false,如果找到false=true
2.this.属性 = 属性
//修改链表
public void updata(int item,int newItem) {
if(head.next == null) {
System.out.println("链表为空,不能修改");
return;
}
Node temp = head.next;
boolean flag = false;
while(true) {
if(temp.item == item) {
flag = true;
temp.item = newItem;
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("修改成功!!!");
}else {
System.out.println("没有找到该节点");
}
}
删除单向链表的节点:
1.定义一个辅助指针(temp)指向需要删除的节点位置的前一个节点的位置,定义boolean的flag默认值=false,如果找到false=true
2.temp.next = temp.next.next;
//删除链表
public void del(int item) {
Node temp = head;
boolean flag = false;
if(head.next == null) {
System.out.println("该链表为空,无法删除");
}
while(true) {
if(temp.next.item == item) {
flag = true;
temp.next = temp.next.next;
break;
}
if(temp.next == null) {
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("删除成功");
}else {
System.out.println("没有找到此节点");
}
}
总代码:
class SingleList{
//先创建一个头节点,不存放具体数据
Node head = new Node(0, null);
//向链表尾添加数据
public void add(Node newNode) {
if(head.next == null) {
head.next = newNode;
return;
}
Node temp = head;
while(temp.next != null) {//找到链表的最后
temp = temp.next;
}
temp.next = newNode;
}
//按照顺序添加数据
public void addByOrder(Node newNode) {
if(head.next == null) {
head.next = newNode;
return;
}
Node temp = head.next;
boolean flag = false;
while(true) {
if(temp.next != null) {
if(temp.next.item > newNode.item ) {
break;
}else if(temp.next.item == newNode.item){
flag = true;
}
}else {
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("已经存在不能添加");
}else {
if(temp.next == null) {
temp.next = newNode;
}else {
newNode.next = temp.next;
temp.next = newNode;
}
}
}
//修改链表
public void updata(int item,int newItem) {
if(head.next == null) {
System.out.println("链表为空,不能修改");
return;
}
Node temp = head.next;
boolean flag = false;
while(true) {
if(temp.item == item) {
flag = true;
temp.item = newItem;
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("修改成功!!!");
}else {
System.out.println("没有找到该节点");
}
}
//删除链表
public void del(int item) {
Node temp = head;
boolean flag = false;
if(head.next == null) {
System.out.println("该链表为空,无法删除");
}
while(true) {
if(temp.next.item == item) {
flag = true;
temp.next = temp.next.next;
break;
}
if(temp.next == null) {
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("删除成功");
}else {
System.out.println("没有找到此节点");
}
}
//遍历
public void printList() {
Node temp = head.next;
while(temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
//定义一个节点类
class Node{
int item;
Node next;//指向下一个节点
public Node(int item, Node next) {
super();
this.item = item;
this.next = next;
}
public Node(int item) {
super();
this.item = item;
}
public Node() {
super();
}
@Override
public String toString() {
return "Node [item=" + item + "]";
}
}