删除节点
删除节点重要的是创建两个指针:pre和cur,pre指向前一个元素,cur指向当前元素,cur.link指向下一个元素。并要注意头结点是目标节点时要单独讨论。
public void deleteItem(int n){
ListNode pre = null;
ListNode cur = head;
// 如果头节点是要删除的节点,情况比较复杂,需要单独讨论
if (head.data == n){
head = head.link;
cur.link = null;
return;
}
// 在头节点不是目标节点的情况下,根据循环寻找目标节点
// cur指针所在位置是目标节点就交换位置,不是目标节点就让指针向下移动
// 删除节点后记得结束方法
while(cur != null){
if (cur.data == n){
pre.link = cur.link;
cur.link = null;
return;
}else{
pre = cur;
cur = cur.link;
}
}
}
插入节点
// 把节点newnode插入到值为k的节点后面
public void insertItem(ListNode newnode,int k){
ListNode cur = head;
while(cur != null){
if (cur.data ==k){
newnode.link = cur.link;
cur.link = newnode;
return;
}else{
cur = cur.link;
}
}
}
反转链表(我下面使用的是迭代解法)
//让cur.link=pre之后让cur和pre两个指针向后移动,继续让cur.link=pre直到cur=null
public void reverseList(){
//如果链表内没有元素或者只有一个元素不必反转
if (head == null || head.link == null){
return;
}
//定义三个指针
ListNode pre = null;
ListNode cur = head;
ListNode temp = null;
//只要当前指针不为空就需要反转,在pre和cur两个指针向后移动时需要借助一个中介指针temp
while(cur!=null){
temp = cur.link;
cur.link = pre;
pre = cur;
cur = temp;
}
//最终cur指针一定为空,所以pre指针处的元素就是反转链表的头节点
head = pre;
}
删除重复节点
public void RemoveRep(){
ListNode cur = head;
//如果cur的下一个和cur相同,就删除,如果不同进行下一个循环
while(cur.link != null){
if(cur.data == cur.link.data){
ListNode temp = cur.link;
cur.link = cur.link.link;
temp.link = null;
}else{
cur = cur.link;
}
}
}