单链表的操作
节点定义
class Node{
int val;
Node next;
}
单链表创建
private Node head = null;
int size = 0;
增加
定义个新节点,从头添加数据,注意如果为空,则赋值头结点,否则node.next指向头结点,head = ndoe。size加1
public void add(int val){
Node node = new Node();
node.val = val;
if(head == null){
head = node;
}else {
node.val = val;
node.next = head;
head = node;
}
size++;
}
删除
我这里单链表写的非常繁琐,所以双链表删除再祥讲
public void deleteVal(int val){
int index = getByIndex(val);
if(index == -1){
return;
}
Node newNode = head;
if(index == 0){
if(size == 0){
head.next = null;
head = null;
return;
}
head = head.next;
newNode.next = null;
newNode = null;
size--;
return;
}
for (int i = 0; i < index - 1; i++) {
newNode = newNode.next;
}
Node newNode1 = newNode.next;
newNode.next = newNode.next.next;
newNode1.next = null;
newNode1 = null;
size--;
}
双链表的操作
双节点定义
class doubleNode{
doubleNode prev;
int val;
doubleNode next;
public doubleNode() {
}
public doubleNode(int val) {
this.val = val;
}
public doubleNode(doubleNode prev, int val, doubleNode next) {
this.prev = prev;
this.val = val;
this.next = next;
}
}
双链表初始化及增加头结点或未节点
private int size;
private doubleNode head;
private doubleNode tail;
public void addFirst(int val){
doubleNode node = new doubleNode(val);
//这里注意尾节点
if(tail == null){
tail = node;
}else {
node.next = head;
head.prev = node;
}
head = node;
size++;
}
public void addlast(int val){
doubleNode node = new doubleNode(val);
if(head == null){
head = node;
}else {
tail.next = node;
node.prev = tail;
}
tail = node;
size++;
}
根据下标返回节点
这里能迅速返回下标节点位置,更加方便实现删除和添加,修改
public doubleNode node(int index){
if(index < 0 || index >= size){
System.out.println("下标越界!");
return null;
}
doubleNode node = head;
if(index <= size / 2){
for (int i = 0; i < index; i++) {
node = node.next;
}
}else{
node = tail;
for (int i = 0; i < size - index; i++) {
node = node.prev;
}
}
return node;
}
删除节点
这点处理好,删除操作就非常简单了
public void unlike(doubleNode node){
//****重要****
//这里先处理前驱和删除节点的关系,在处理后驱与删除节点的关系。先前再后的思想很重要
doubleNode prev = node.prev;
doubleNode cur = node.next;
if(prev == null){
head = cur;
}else{
prev.next = cur;
node.prev = null;
}
if(cur == null){
tail = prev;
}else {
cur.prev = prev;
node.next = null;
}
size--;
}
总结
总的来说链表比较简单,只需要注意主要几个步骤(删节点,找节点位置,头部位置),其它都很简单。
再者做题的话:
1.注意数学思想,用数学思考
2.递归用的话注意最后一个要处理的节点的处理,与剩余节点关系
3.快满指针,迭代,二分法,圆圈。
4.做题边界条件极为重压,开始就要考虑空指针问题。在这里插入代码片