题目:
解题思想:
链表题做插入(特别含头部),删除结点操作使用头结点可以很好的保证循环的一致性,例如此题,如果没有头结点要删除第一个结点需要思考一个较为复杂的操作,但是如果加入了头结点,我们只需在每次遍历判断中间结点指向的下一个结点是否为空,不为空的话是否是需要删除的结点即可
public ListNode removeElements(ListNode head, int val) {
ListNode head1 = new ListNode(-1, head);
ListNode temp = head1;
while(temp.next != null){
if(temp.next.val == val){
temp.next = temp.next.next;
}else{
temp = temp.next;
}
}
return head1.next;
}
题目:
解题思想:
双指针方法。首先思考一个问题,遍历过程中(两个指针一起移动),他们间隔需要多少?假设两个指针时紧挨着的,是否可以做到指针指向倒装的操作呢?
如图,1指向2,小指针指向结点1,大指针指向结点2,现在倒装1和2的指针指向,大指针指向结点2,2结点的指向改成指向1(不再指向3),完成了指向调转的操作,看似很完美,但是尴尬的是已经无法遍历到结点3了。
解法很简单,我们在交换过程中用局部变量保留结点3,下次循环,小指针指向大指针指向的结点,大指针就这个局部变量。
那从哪个结点开始循环呢?我们需要想出一个虚假的null结点供第一个结点转向,所以小指针一开始指向null,大指针指向结点1。
public ListNode reverseList(ListNode head) {
ListNode cur = null;
ListNode pre = head;
ListNode temp;
while(pre != null){
temp = pre.next;
pre.next = cur;
cur = pre;
pre = temp;
}
return cur;
}