分析:
- 首先,因为头结点也有可能被交换,所以需要在头结点之前创建一个新结点,然后连接到现有的链表之前。
- 新建指针pre1和pre2作为v1和v2的前结点,扫描链表,若pre1或者pre2为空,说明未找到v1或v2。
- 如果pre1和pre2相邻,即pre1.next=pre2,则交换,使得pre1在前pre2在后。
- 讨论两种情况,分别为pre1.next==pre2和pre1与pre2不相邻的情况。
public ListNode swapNodes(ListNode head, int v1, int v2) { // write your code here ListNode newhead=new ListNode(-1); newhead.next=head; ListNode pre1=null,pre2=null; ListNode cur=newhead; while(cur.next!=null){ if(cur.next.val==v1){ pre1=cur; }else if (cur.next.val==v2){ pre2=cur; } cur=cur.next; } if(pre1==null || pre2==null) return head; // 未找到结点v1和v2 //使v1和v2两节点在相邻时保持v1在前v2在后 if(pre2.next==pre1){ ListNode t=pre2; pre2=pre1; pre1=t; } ListNode node1=pre1.next; ListNode node2=pre2.next; ListNode node2Next=node2.next; if(pre1.next==pre2){ pre1.next=node2; node2.next=node1; node1.next=node2Next; }else{ pre1.next=node2; node2.next=node1.next; pre2.next=node1; node1.next=node2Next; } return newhead.next; }