数据结构学习:链表的基本实现
1.链表的定义:
线性表是一类很常用的数据结构,分为顺序表和链表。其中顺序表可以简单地理解成数组这个概念。按正常方式定义一个数组时,计算机会从内存中取出一块连续的地址来存放给定长度的数组;而链表则使由若干个结点组成(每个结点代表一个元素),且结点在内存中的存储位置通常是不连续的。除此之外,链表的两个结点之间一般通过一个指针来从一个结点指向另一个结点,因此链表的结点一般由两部分构成,即数据域和指针域:
class Node{
int data;
Node next;
};
一般来说,数据域存放结点要存储的数据,而指针域指向下一个结点的地址,这样就会产生从某个结点开始的、由指针连接的一条链式结构,即链表。而以链表是否存在头结点,又可以把链表分为带头结点的链表和不带头结点的链表。头结点一般称为head,且其数据域data不存放任何内容,而指针域next指向第一个数据域有内容的结点(一般直接把这个结点叫作第一个结点)。两种链表的写法大同小异。
2.链表的基本操作在java中的实现:
package shujujiegou;
import java.util.*;
//构建节点类
class Node{
int data;
Node next;
};
public class 链表 {
//1.创建动态链表
static Node Create(int[] a){
//head:头节点,pre:当前节点的前置节点,p:当前节点
//先创建一个头节点,将其next设为null,同时将pre指向头节点
Node head,pre,p;
head = new Node();
head.next = null;
pre = new Node();
pre = head;
//依次创建节点
for(int i=0;i<a.length;i++){
//创建当前节点p,将data设为a[i],next设为null
p = new Node();
p.data = a[i];
p.next = null;
//然后让上一个节点的next指向当前节点,并将上一个节点改为当前节点(因为现在当前节点就是下一个节点的上一个节点了)
pre.next = p;
pre = p;
};
return head;
};
//2.查找元素x在以head为头节点的链表中有多少个
static int inquire(Node head,int x){
Node p = head.next;
int count = 0 ;
while(p!=null){
if(p.data == x){
count++;
};
p = p.next;
};
return count;
};
//3.将x插入到以N为头节点的链表的第pos位置上
static void insert(Node head,int pos,int x){
Node pre = head;
for(int i=0;i<pos-1;i++){
pre = pre.next;
};
Node p = new Node();
p.data = x;
p.next = pre.next;
pre.next = p;
}
//4.删除以head为头结点的链表中所有数据为x的结点
static void del(Node head,int x){
Node p = head.next;
Node pre = head;
while(p!=null){
if(p.data == x){
pre.next = p.next;
};
pre = p;
p = p.next;
}
}
public static void main(String[] args) {
int[] a = new int[]{1,3,5,7,8,5};
Node head = Create(a);
//后面需要什么方法调用即可
}
}
3.算法例题:反转链表
解:
根据链表的定义,可以在遍历链表时,将当前节点的next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
class Solution {
public ListNode reverseList(ListNode head) {
//前一个节点
ListNode prev = null;
//当前节点
ListNode curr = head;
while(curr!=null){
//先存储后一个节点
ListNode p = curr.next;
//把当前节点的next改成前一个节点
curr.next = prev;
//当前节点next处理完了,把前一个节点改为当前节点
prev = curr;
//把当前节点改为下一个节点
curr = p;
};
return prev;
}
}