整理一些关于链表的操作,供自己来进行复习。
- 反转链表
public ListNode resverse(ListNode head){
if(head == null || head.next == null)return head;
ListNode pre = null;
ListNode curr = head;
ListNode nextNode = head.next;
while(nextNode != null){
curr.next = pre;
pre = curr;
curr = nextNode;
nextNode = nextNode.next;
}
curr.next = pre;
return curr;
}
注意while循环的条件
- 快慢指针查找链表的一半的位置
public ListNode findHalf(ListNode head){
if(head == null || head.next == null) return head;
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fasst.next.next;
}
return slow;
}
注意while循环的条件
- 删除数据域为特定值的所有节点
public ListNode delete(ListNode head,int data){
if(head == null)return head;
//创建一个哨兵
ListNode p = new ListNode(0);
p.next = head;
ListNode h = p;
//开始查找
while(h.next != null){
if(h.next.val == data) {
h.next = h.next.next;
}
else{
h = h.next;
}
}
//删除哨兵
h = p.next;
return h;
}
这里注意,while循环里的else和else执行体是不一样的:
- 如果哨兵所指的下一个节点的val等于data,p.next = p.next.next,不用移动p;
- 否则,将p向前移动一位。
注意:这里设置了一个哨兵来简化操作,要灵活运行用。
未完待续